[英]How do I set up a nodejs server that gives the client the correct file by checking the url?
I am trying to write a node js server that gives back whatever the user requested, if the resource is in the file system. 我正在尝试编写节点js服务器,如果资源在文件系统中,则返回用户请求的任何内容。
For example, if the request URL were /index.html
, it would try to find a file called 'index.html' in the root directory and respond with a stream to that file. 例如,如果请求URL是
/index.html
,它将尝试在根目录中找到名为“index.html”的文件,并使用该文件的流进行响应。 If the request were /myscript.js
, it would do the same, finding a file called myscript.js
and piping that to the response. 如果请求是
/myscript.js
,它会做同样的事情,找到一个名为myscript.js
的文件并将其传递给响应。
Here is what I have so far: 这是我到目前为止:
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 +'/');
There are a few things that I don't like about this code: 关于这段代码我有一些不喜欢的事情:
fs
thinks that whenever the path starts with /
, the file does not exist, so I must add a .
fs
认为每当路径以/
开头时,文件就不存在,所以我必须添加一个.
before the file path. Addressing your two bullet points: 解决你的两个要点:
.
.
when using fs
because fs
will look at the root directory of your system otherwise. fs
因为fs
会查看系统的根目录。 Remember, the system root is different than your server root. path.extname
and then a switch
statement to set the content type like so. path.extname
然后使用switch
语句来设置内容类型。 The code below is taken from an blog post I wrote on how to set up a simple static server using Node without Express: 下面的代码来自我写的关于如何使用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.