Skip to content

Instantly share code, notes, and snippets.

@lqt0223
Created March 6, 2017 15:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lqt0223/ce2868c60d59ad9879a5477b75e68049 to your computer and use it in GitHub Desktop.
Save lqt0223/ce2868c60d59ad9879a5477b75e68049 to your computer and use it in GitHub Desktop.
06 Super tiny static file server using Node.js

Node.js超短代码实现静态文件服务器 

许久不写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;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment