我的印象是,当您运行nodejs webserver时,Web的根目录是包含实现Web服务器的js文件的文件夹。因此,如果你有C:\ foo \ server.js并且你运行它,那么“/”指的是C:\ foo和“/index.htm”映射到C:\ foo \ index.htm
我有一个带有兄弟文件default.htm的文件server.js,但是当我尝试加载/default.htm的内容时,找不到该文件。绝对文件路径有效。
“/”在哪里以及它控制了什么?
编写一个repro我简化了它:
var fs = require('fs');
var body = fs.readFileSync('/default.htm');
并注意到它正在寻找这个
Error: ENOENT, no such file or directory 'C:\default.htm'
所以“/”映射到C:\
有没有办法控制Web根目录的映射?
我注意到相对路径确实有效。所以
var fs = require('fs');
var body = fs.readFileSync('default.htm');
成功。
我相信我的混淆源于我原始实验的项目文件巧合地放置在驱动器的根部。这允许正确解析对/default.htm的引用;只有当我把东西放到一个文件夹中才能将它们置于源代码管理之下时才会发现这个问题。
我一定会调查快递,但你没有回答我的问题:是否有可能重新映射网络根目录,如果是这样的话?
感兴趣的是这是目前的server.js
var http = require('http');
var fs = require('fs');
var sys = require('sys');
var formidable = require('formidable');
var util = require('util');
var URL = require('url');
var QueryString = require('querystring');
var mimeMap = { htm : "text/html", css : "text/css", json : "application/json" };
http.createServer(function (request, response) {
var body, token, value, mimeType;
var url = URL.parse(request.url);
var path = url.pathname;
var params = QueryString.parse(url.query);
console.log(request.method + " " + path);
switch (path) {
case "/getsettings":
try {
mimeType = "application/json";
body = fs.readFileSync("dummy.json"); //mock db
} catch(exception) {
console.log(exception.text);
body = exception;
}
break;
case "/setsettings":
mimeType = "application/json";
body="{}";
console.log(params);
break;
case "/":
path = "default.htm";
default:
try {
mimeType = mimeMap[path.substring(path.lastIndexOf('.') + 1)];
if (mimeType) {
body = fs.readFileSync(path);
} else {
mimeType = "text/html";
body = "<h1>Error</h1><body>Could not resolve mime type from file extension</body>";
}
} catch (exception) {
mimeType = "text/html";
body = "<h1>404 - not found</h1>" + exception.toString();
}
break;
}
response.writeHead(200, {'Content-Type': mimeType});
response.writeHead(200, {'Cache-Control': 'no-cache'});
response.writeHead(200, {'Pragma': 'no-cache'});
response.end(body);
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');
我并不完全确定你所说的“路线”是什么意思,但我怀疑设置和设置是你的意思,如果我错了就纠正我。
Nodejs似乎不支持Web根的任意映射。
所需要的只是在文件系统中使用它们之前使用句点添加绝对Web路径:
var URL = require('url');
var url = URL.parse(request.url);
var path = url.pathname;
if (path[0] == '/')
path = '.' + path;
答案 0 :(得分:4)
虽然你是正确的,服务器的根目录是当前的工作目录Node.js不会直接传递给你的文件系统上的文件,但这可能会带来一些安全风险
相反,您需要为其提供路由,然后这些路由会为正在进行的请求提供内容。
像
这样的简单服务器var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
将捕获任何请求并以相同方式响应(但不读取文件系统)。
现在,如果您想要提供文件内容,您需要指定一些方法将该文件读入响应流,这可以通过以下几种方式完成:
fs
API在磁盘上查找文件,将其内容读入内存,然后将其传输到响应中。这是一种非常繁琐的方法,特别是当您开始获取大量文件时,它确实可以让您直接控制应用程序中发生的事情。express.js
这样的中间件服务器,IMO是一个更好的方法来做您想做的事情。在StackOverflow上使用Express有很多问题和答案,this is a good example of a static server这就是你所说的澄清问题的原因是:
var body = fs.readFileSync('/default.htm');
认为文件位于C:\default.htm
的结果是因为您使用的是绝对路径,而不是相对路径。如果你有:
var body = fs.readFileSync('./default.htm');
然后它会知道您想要相对于当前工作目录进行操作。 /
是来自分区的根,./
是来自当前工作目录。