我試圖在nodejs中創建一個靜態文件服務器,作爲理解節點的練習,而不是理想的服務器。我非常瞭解像Connect和node-static這樣的項目,並且完全打算將這些庫用於更多可用於生產的代碼,但我也想了解我正在使用的基礎知識。考慮到這一點,我編寫了一個小server.js:NodeJS中的基本靜態文件服務器
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等在節點還是有一個更好/更優雅/更強大的方法?
節點中的.pipe()基本上只是在執行以下操作?
。
var fileStream = fs.createReadStream(filename);
fileStream.on('data', function (data) {
res.write(data);
});
fileStream.on('end', function() {
res.end();
});
謝謝大家!
我寫了一個模塊,可以在不影響靈活性的情況下做到這一點。它也會自動緩存所有資源。檢查出來:https://github.com/topcloud/cachemere – Jon
有趣的是,你選擇(?)返回'404未找到'與HTTP狀態代碼'200 OK'。如果在URL中沒有找到資源,則適當的代碼應該是404(並且您在文檔正文中編寫的內容通常是次要的)。否則你會混淆許多用戶代理(包括網絡爬蟲和其他機器人),給他們的文件沒有真正的價值(他們也可能緩存)。 – amn
謝謝。許多年後仍然很好地工作。 – statosdotcom