繁体   English   中英

如何设置nodejs服务器,通过检查URL为客户端提供正确的文件?

[英]How do I set up a nodejs server that gives the client the correct file by checking the url?

我正在尝试编写节点js服务器,如果资源在文件系统中,则返回用户请求的任何内容。

例如,如果请求URL是/index.html ,它将尝试在根目录中找到名为“index.html”的文件,并使用该文件的流进行响应。 如果请求是/myscript.js ,它会做同样的事情,找到一个名为myscript.js的文件并将其传递给响应。

这是我到目前为止:

var http = require("http");
var fs = require("fs");
var port = process.env.PORT || 3000;
http.createServer(function (request, response) {
    if (request.method == "GET") {
        console.log(request.url);
        if (request.url == "/") { // if the url is "/", respond with the home page
            response.writeHead(200, {"Content-Type": "text/html"});
            fs.createReadStream("index.html").pipe(response);
        } else if (fs.existsSync("." + request.url)) {
            response.writeHead(200/*, {"Content-Type": request.headers['content-type']}*/);
            fs.createReadStream("." + request.url).pipe(response);
        } else {
            response.writeHead(404, {"Content-Type": "text/plain"});
            response.end("404 Not Found");
        }
    } else {
        response.writeHead(404, {"Content-Type": "text/plain"});
        response.end("404 Not Found");
    }
}).listen(port);

// Console will print the message
console.log('Server running at http://127.0.0.1:' + port +'/');

关于这段代码我有一些不喜欢的事情:

  • 显然fs认为每当路径以/开头时,文件就不存在,所以我必须添加一个. 在文件路径之前。 见第10和第12行。这总是有效吗? 我觉得这是解决这个问题的一个非常糟糕的伎俩。
  • 我不知道所请求文件的内容类型(第11行)。 我在网上搜索并发现很多方法可以使用我必须使用npm安装的其他模块。 节点中是否有东西可以找出内容类型?

解决你的两个要点:

  • 你需要一个有意义的. 使用fs因为fs会查看系统的根目录。 请记住,系统根目录与服务器根目录不同。
  • 一个想法是使用path.extname然后使用switch语句来设置内容类型。

下面的代码来自我写的关于如何使用Node而不是Express设置简单静态服务器的博客文章

let filePath = `.${request.url}`; // ./path/to/file.ext
let ext = path.extname(filePath); // .ext
let contentType = 'application/octet-stream'; // default content type

if(ext === '') {

    filePath = './index.html'; // serve index.html
    ext = '.html';
}

switch (ext) {

    case '.html':
        contentType = 'text/html';
        break;

    case '.css':
        contentType = 'text/css';
        break;

    case 'js':
        contentType = 'text/javascript';
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM