2

当我这样做时,fs.readFile(file...我收到此错误:

{ [错误:ENOENT,打开 'foundation/css/normalize.css']

错误号:34,

代码:'ENOENT',

路径:'基础/css/normalize.css'}

我是否必须相对于链接它们的 HTML 文件或相对于运行服务器和路由器的 node.js 文件的位置来路由我的路径?

不,我没有使用快递,“使用快递”不是一个可以接受的答案。


编辑

@BenjaminGruenbaum 的最后评论。我不确定我的 HTTP 响应是什么意思,但我的代码逻辑如下:我通过 URI 加载我的 index.html,当它readFile是文档时,它递归地遍历所有其他链接文件。我有一个脚本可以将其分解以正确显示正确的Content-Type. 我将它包括在这里,因为它太长了,无法发表评论:

function route(handle, pathname, response, request){
// console.log("About to route a request for " + pathname);

if (typeof handle[pathname] === "function"){        
    handle[pathname](response, request);
    } else {

    // console.log('NON HTML');
    // console.log(pathname);

    var file_path = "";
    var mimes = {
        'css':  'text/css',
        'js':   'text/javascript',
        'htm':  'text/html',
        'html': 'text/html',
        'png': 'image/png',
        'jpg': 'image/jpg',
        'jpeg': 'image/jpeg'
    };

    // parses the url request for a file and pulls the pathname
    var url_request = url.parse(request.url).pathname;      
    // console.log('URL REQUEST');
    // console.log(url_request);

    // finds the placement of '.' to determine the extension    
    var tmp  = url_request.lastIndexOf(".");
    // determines the extension by uing .substring that takes everything after '.'
    var extension  = url_request.substring((tmp + 1));
    // console.log('EXTENSION');
    // console.log(extension);


    //set path of static pages
    if (extension === 'css' || extension === 'js' || extension === 'htm' || extension === 'html' || extension === 'png' || extension === 'jpg' || extension === 'jpeg'){

        // console.log('LOAD STATIC PAGE');
        file_path = url_request.replace("/", "");
        // console.log(file_path);
        // console.log();
    }

    //load needed pages and static files
    fs.readFile(file_path, function (error, data){
        if(error){
            // console.log("AM I DEAD");

            // console.log(error);
            // console.log();
            response.writeHeader(500, {"Content-Type": "text/html"});  
            response.write("<h1>FS READ FILE ERROR: Internal Server Error!</h1>");    
        }
        else{
            response.writeHeader(200, {"Content-Type": mimes[extension]});  

            console.log('SHOULD BE SUCCESS')
            console.log(mimes[extension]);
            // console.log(data);
            response.write(data);
        }

        response.end();  
    });
    response.end();
}
}

exports.route = route;

正如您可以通过我有多少个地方来判断的那样,console.log()我可以一直追踪到底部它在这里失败了:

else{
            response.writeHeader(200, {"Content-Type": mimes[extension]});  

            console.log('SHOULD BE SUCCESS')
            console.log(mimes[extension]);
            // console.log(data);
            response.write(data);
        }

我为有点草率的缩进道歉。


最终编辑:

可以在我的以下问题中找到对这种愚蠢情况的最终解决方案:Node.js - 资源解释为脚本但使用 MIME 类型 text/plain 传输

非常感谢@BenjaminGruenbaum 忍受 Noob

4

1 回答 1

2

您必须使用相对于 NodeJS 文件的路径(更具体地说是入口点),而不是客户端 HTML。

这就像它在 bash 脚本、Python 和几乎任何其他语言中工作一样,它具有合理的 API,可以合理地调用操作系统中的本机文件系统函数。

事实上,客户端 HTML 与 Node 中的路径几乎没有关系——在 Node 的立场上,它只是在 HTTP 响应中发送给客户端的文本。它根本不知道服务器的内部文件系统。

(另外,我看不出像快递这样的东西有什么帮助)

于 2013-08-01T21:06:16.883 回答