看看这个要点。我在这里复制它以供参考,但要点已定期更新。
Node.JS 静态文件网络服务器。将它放在您的路径中以在任何目录中启动服务器,采用可选的端口参数。
var http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs"),
port = process.argv[2] || 8888;
http.createServer(function(request, response) {
var uri = url.parse(request.url).pathname
, filename = path.join(process.cwd(), uri);
fs.exists(filename, function(exists) {
if(!exists) {
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
response.end();
return;
}
if (fs.statSync(filename).isDirectory()) filename += '/index.html';
fs.readFile(filename, "binary", function(err, file) {
if(err) {
response.writeHead(500, {"Content-Type": "text/plain"});
response.write(err + "\n");
response.end();
return;
}
response.writeHead(200);
response.write(file, "binary");
response.end();
});
});
}).listen(parseInt(port, 10));
console.log("Static file server running at\n => http://localhost:" + port + "/\nCTRL + C to shutdown");
更新
要点确实处理 css 和 js 文件。我自己用过。在“二进制”模式下使用读/写不是问题。这只是意味着文件不会被文件库解释为文本,并且与响应中返回的内容类型无关。
您的代码的问题是您总是返回“文本/纯文本”的内容类型。上面的代码没有返回任何内容类型,但如果你只是将它用于 HTML、CSS 和 JS,浏览器可以很好地推断出这些。没有内容类型比错误的更好。
通常,内容类型是您的 Web 服务器的配置。因此,如果这不能解决您的问题,我很抱歉,但它作为一个简单的开发服务器对我有用,并认为它可能会帮助其他人。如果您在响应中确实需要正确的内容类型,您要么需要像 joeytwiddle 那样明确定义它们,要么使用像 Connect 这样具有合理默认值的库。这样做的好处是它简单且独立(无依赖性)。
但我确实感觉到你的问题。所以这里是组合解决方案。
var http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs")
port = process.argv[2] || 8888;
http.createServer(function(request, response) {
var uri = url.parse(request.url).pathname
, filename = path.join(process.cwd(), uri);
var contentTypesByExtension = {
'.html': "text/html",
'.css': "text/css",
'.js': "text/javascript"
};
fs.exists(filename, function(exists) {
if(!exists) {
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
response.end();
return;
}
if (fs.statSync(filename).isDirectory()) filename += '/index.html';
fs.readFile(filename, "binary", function(err, file) {
if(err) {
response.writeHead(500, {"Content-Type": "text/plain"});
response.write(err + "\n");
response.end();
return;
}
var headers = {};
var contentType = contentTypesByExtension[path.extname(filename)];
if (contentType) headers["Content-Type"] = contentType;
response.writeHead(200, headers);
response.write(file, "binary");
response.end();
});
});
}).listen(parseInt(port, 10));
console.log("Static file server running at\n => http://localhost:" + port + "/\nCTRL + C to shutdown");