在此示例中,我制作了一个中间件,该中间件应该在根目录上登录req.path
。服务器似乎完全忽略了此功能:
var express = require('express');
var path = require('path');
var app = express();
app.use('/', express.static("./public"));
app.use('/', function(req, res, next){ // the functions
console.log("req.path = ", req.path); // no console entries on request
next();
})
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
我还尝试将express.static()
和函数作为app.use
的参数放在一起,但仍然无效:
var express = require('express');
var path = require('path');
var app = express();
app.use('/',
express.static("./public"),
function(req, res, next){
console.log("req.path = ", req.path);
next();
});
function foo(req, res, next){
console.log(req.path);
next();
}
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
我不正确是什么?
编辑:如果我将中间件放在express.static
之前,它将按预期工作。似乎是什么问题?
答案 0 :(得分:1)
使用时
app.use('/', express.static("./public"));
正在发生两件事。
1) .use
基本上用于向所有与路径匹配的请求中添加中间件。或者,如果未指定路径,它将用于所有路由。
仅供参考::所有中间件的请求均按其声明位置进行。例如:
app.use(mid1);
app.use(mid2);
表示请求将通过 mid1 , mid2 和路径 handler 。
2)通过.use
和static
来/
意味着每条路由/*
都将通过express.static
中间件并尝试在您的public
文件夹中找到该文件。如果找不到,您将得到404,并且不会转到下一个中间件。如果找到,它将使用stream.pipe(res)
因此,在中间件之后使用express.static
是指首先浏览我的中间件,然后在./public
文件夹中搜索。
您所能做的就是提升中间件,并为静态中间件使用特定的路由。