【发布时间】:2011-11-08 05:49:36
【问题描述】:
我正在尝试在 nodejs 中创建一个静态文件服务器,而不是作为一个完美的服务器来理解 node。我非常了解 Connect 和 node-static 之类的项目,并且完全打算将这些库用于更多可用于生产的代码,但我也想了解我正在使用的基础知识。考虑到这一点,我编写了一个小型 server.js:
var http = require('http'),
url = require('url'),
path = require('path'),
fs = require('fs');
var mimeTypes = {
"html": "text/html",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"png": "image/png",
"js": "text/javascript",
"css": "text/css"};
http.createServer(function(req, res) {
var uri = url.parse(req.url).pathname;
var filename = path.join(process.cwd(), uri);
path.exists(filename, function(exists) {
if(!exists) {
console.log("not exists: " + filename);
res.writeHead(200, {'Content-Type': 'text/plain'});
res.write('404 Not Found\n');
res.end();
}
var mimeType = mimeTypes[path.extname(filename).split(".")[1]];
res.writeHead(200, mimeType);
var fileStream = fs.createReadStream(filename);
fileStream.pipe(res);
}); //end path.exists
}).listen(1337);
我的问题是双重的
这是在节点中创建和流式传输基本 html 等的“正确”方法,还是有更好/更优雅/更健壮的方法?
node中的.pipe()基本上只是在做下面的事情吗?
.
var fileStream = fs.createReadStream(filename);
fileStream.on('data', function (data) {
res.write(data);
});
fileStream.on('end', function() {
res.end();
});
谢谢大家!
【问题讨论】:
-
我写了一个模块,可以让你在不影响灵活性的情况下做到这一点。它还会自动缓存您的所有资源。看看:github.com/topcloud/cachemere
-
您选择(?)返回“404 Not Found”和 HTTP 状态代码“200 OK”有点有趣。如果在 URL 上找不到资源,那么适当的代码应该是 404(您在文档正文中写的内容通常是次要的)。否则你会混淆很多用户代理(包括网络爬虫和其他机器人)给他们的文档没有真正的价值(他们也可能缓存)。
-
谢谢。多年后仍然很好地工作。
-
谢谢!这段代码运行良好。但是现在在上面的代码中使用
fs.exists()而不是path.exists()。干杯!是的!不要忘记return: -
注意:1)
fs.exists()已弃用。使用fs.access()或更好的上述用例fs.stat()。 2)url.parse已弃用;请改用较新的new URL接口。