在关于Node.js的URL模块(https://www.w3schools.com/nodejs/nodejs_url.asp)的教程之后,我注意到文件名在成为fs.readFile的参数之前已经有了一个起始点(第7行)。服务器返回404,但没有点,但我无法理解原因。你能帮忙吗?
var http = require('http');
var url = require('url');
var fs = require('fs');
http.createServer(function (req, res) {
var q = url.parse(req.url, true);
var filename = "." + q.pathname; // here it gets the DOT
fs.readFile(filename, function(err, data) {
if (err) {
res.writeHead(404, {'Content-Type': 'text/html'});
return res.end("404 Not Found");
}
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data);
return res.end();
});
}).listen(8080);
答案 0 :(得分:0)
前导点的原因是该示例的逻辑是打开本地文件。
q.pathname
将返回类似/
...的内容,因此在其前面添加一个.
,您将得到类似./
...的内容,该文件标识一个文件。在运行node.js程序的目录中。
答案 1 :(得分:0)
如文章所述,q.pathname
是/default.htm
:
var adr = 'http://localhost:8080/default.htm?year=2017&month=february';
var q = url.parse(adr, true);
console.log(q.host); //returns 'localhost:8080'
console.log(q.pathname); //returns '/default.htm'
/default.htm
是绝对文件路径,fs.readFile
将从根目录读取,而./default.htm
是相对路径,fs.readFile
从当前工作目录读取。
应该提到的是,字符串串联不是创建文件路径的安全方法,最好使用path.join
:
var path = require('path');
...
var filename = path.join(".", q.pathname); // === 'default.htm'