我正在尝试构建一个基本的静态Web服务器,非常简单,几行,处理3个请求,一个图标,js和html文件:
项目结构:
-D:
-project
-build
-index.html
-fav.icon
-dist.js
-server.js
server.js中的代码
http.createServer(function(req, res) {
//create dynamic filepath for response via requests MIME type
let filePath = './build' + req.url;
fs.access(filePath, callback(err){
console.log(err);
res.writeHead(200, {'Content-Type': contentType});
let file = fs.createReadStream(__dirname + filePath);
file.pipe(res);
});
});
奇怪的是,我记得昨晚filePath工作了,但我不确定发生了什么或者我改变了什么,现在不行。所以我试着调试它,现在控制台会显示:
'no such file...D:\project.\build\'
有一个'。'在'\ build'之前,所以我试图删除它:
let filePath = '/build' + req.url;
然后会显示
'no such file...D:\build\'
'project'目录在哪里?再次,删除'/'brfore'build':
let filePath = 'build' + req.url;
'项目'回来了:
'no such file...D:\projectbuild\'
我尝试使用path.resolve(__ dirname,绝对路径)和path.join(__ dirname,相对路径),它们都返回相同。
我不知道为什么我昨晚可以访问我的服务器,但不是今天,我记得在某个地方我看到了“节点文件路径规则”或“节点文件访问规则”的链接,我用Google搜索了并尝试在Node Document中搜索,但没有运气,那么在Node中访问路径的规则是什么?
答案 0 :(得分:1)
好的,所以__dirname将是您正在运行的文件的目录。因此,例如,如果您当前的工作目录是D:\project
并且您运行node server.js
,那么__dirname将返回" D:\ project"正如你所料。但是,如果您当前的工作目录实际上是D:\
并且您运行node project\server.js
,那么您可能不会期望" D:\ project"的结果。
如果你正在做什么,你想加入" __ dirname"用" build"然后最后是有问题的文件名。如果req.url
是" index.html",则您需要阅读位于__dirname + \ + build + \ + index.html
的文件。
因此,您正在寻找的联接功能将是这样的:
var fileUrl = path.join(__dirname, 'build', req.url);
path.join
函数应该处理平台的规范化等等。