许久不写JS了,今天来留一段自己写得非常精炼的代码。Node.js,后端的。
功能为静态文件服务器,具体指的是:
- 把本地硬盘上的一个文件夹作为根目录,放到 http://localhost:XXXX/上
- 通过服务器url访问文件的层级,与本地硬盘上该文件夹中文件的层级完全一样
- 服务器不作路由,不接受参数,不返回数据,只返回相应位置的文件
以下是代码:
var http = require("http");
var url = require("url");
var fs = require("fs");
// 这次是把这个方法装在了一个ServerUtil模块中
function ServerUtil(){}
// 这是一个文件后缀者和它在被服务器返回时需要设置的Content-Type之间的映射表
ServerUtil.mimeMap = {
"html": "text/html",
"js": "application/x-javascript"
// 以后需要支持更多类型的文件,如css, jpg等的时候,可以在这里添加
};
// 主方法
ServerUtil.createFileServer = function(port){
var server = http.createServer(handler).listen(port);
console.log("Server running on " + port);
}
function handler(req,res){
var path = url.parse(req.url).pathname;
var ext = path.split(".")[1];
// 这个文件十分让人无语,如果不需要标签页上那个网页icon的话先禁用吧
if(req.url != "/favicon.ico"){
res.writeHead(200,{
"ContentType": ServerUtil.mimeMap[ext]
});
// 这次是以Util模块的形式写的,所以放在了根目录/lib文件夹中。在生成相对路径时相对比较麻烦
var fileDir = __dirname.split("/");
fileDir.pop();
fileDir = fileDir.join("/") + path;
// 找到文件则返回文件,找不到则返回404
// Node.js的pipe()方法十分好用,可以自动调配,使流的生产者和消费者之间可以同步
fs.existsSync(fileDir) ? fs.createReadStream(fileDir).pipe(res) : res.end("404 Not Found");
}
}
// 导出此模块
module.exports = ServerUtil;