在 Node 中,__dirname 是一个全局对象,其中包含执行脚本所在目录的名称。例如,如果您从/home/user/env 运行node script.js,那么__dirname 将包含`/home/user/env。
app.use() 方法是继承自 Connect 框架的函数,该框架是 Express 所写的框架。该方法将一个中间件函数附加到应用程序堆栈,该函数在 Express 每次收到请求时运行。
您显示的代码将静态服务器安装到路径/,该路径从执行脚本的目录读取:
app.use('/', express.static(__dirname));
如果您要将路径更改为/path,则静态文件服务器将改为从该路径提供静态文件。如果不指定路径,则默认使用/。
至于express.static() 自己做什么,它接受一个路径并返回一个监听请求的中间件函数。这就是中间件的工作原理:
- 检查请求方法是
GET还是HEAD。如果两者都没有,请忽略该请求。
- 解析路径并暂停请求。
- 检查是否有默认重定向。如果是这样,请使用
HTTP 303 重定向。
- 定义遇到目录或错误的处理程序。
- 将所有内容传递给 send 模块,以进行 MIME 识别和文件服务。
这是来自 Connect 的 static() 中间件源供参考:
exports = module.exports = function(root, options) {
options = options || {};
// root required
if (!root) throw new Error('static() root path required');
// default redirect
var redirect = false !== options.redirect;
return function staticMiddleware(req, res, next) {
if ('GET' != req.method && 'HEAD' != req.method) return next();
var path = parse(req).pathname;
var pause = utils.pause(req);
function resume() {
next();
pause.resume();
}
function directory() {
if (!redirect) return resume();
var pathname = url.parse(req.originalUrl).pathname;
res.statusCode = 303;
res.setHeader('Location', pathname + '/');
res.end('Redirecting to ' + utils.escape(pathname) + '/');
}
function error(err) {
if (404 == err.status) return resume();
next(err);
}
send(req, path)
.maxage(options.maxAge || 0)
.root(root)
.index(options.index || 'index.html')
.hidden(options.hidden)
.on('error', error)
.on('directory', directory)
.pipe(res);
};
};