为什么fs.readFile(Node.js)的文件名参数前加点?

时间:2018-09-12 16:19:30

标签: node.js

在关于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);

2 个答案:

答案 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'