我正在尝试设置一个在每个页面加载时调用的全局函数,无论它在我的网站中的位置如何。根据Express的API,我使用了
app.all("*", doSomething);
在每个页面加载时调用doSomething函数,但它并不完全有效。该函数会在每个页面加载时触发,除了基本域的页面加载(例如http://domain.com/pageA将调用该函数,但http://domain.com将不会)。有谁知道我做错了什么?
谢谢!
答案 0 :(得分:5)
我知道这是一个旧的,但仍然可能对某人有用。
我认为问题可能是:
app.use(express.static(path.join(__dirname, 'public')));
var router = express.Router();
router.use(function (req, res, next) {
console.log("middleware");
next();
});
router.get('/', function(req, res) {
console.log('root');
});
router.get('/anything', function(req, res) {
console.log('any other path');
});
在任何路径上调用的中间件,/
这是因为express.static默认在public/index.html
/
要解决此问题,请将参数添加到静态中间件:
app.use(express.static(path.join(__dirname, 'public'), {
index: false
}));
答案 1 :(得分:3)
我打赌你放了
app.get('/', fn)
以上
app.all("*", doSomething);
请记住,Express会按照注册顺序执行中间件功能,直到某些内容发送响应为止
答案 2 :(得分:1)
如果您想在每个请求上运行一些代码,则无需使用路由器。
只需将中间件放在路由器上方,每次请求都会调用它:
app.use(function(req, res, next){
//whatever you put here will be executed
//on each request
next(); // BE SURE TO CALL next() !!
});
希望这有帮助
答案 3 :(得分:1)
链中的app.all('*')在哪里?如果它在所有其他路由之后,则可能不会被调用。
app.post("/something",function(req,res,next){ ...dothings.... res.send(200); });
app.all('*',function(req,res) { ...this NEVER gets called. No next and res already sent });
除非你打算将它放在最后,否则你必须确保在前面的路线中调用next()。例如:
app.post("/something",function(req,res,next){ ...dothings.... next();});
app.all('*',function(req,res) { ...this gets called });
另外,doSomething中有什么?你确定它没有被调用吗?
答案 4 :(得分:0)
我也有这个问题,我发现你的doSomething
函数的参数数量可能是一个因素。
function doSomething(req, res, next) {
console.log('this will work');
}
,而:
function doSomething(req, res, next, myOwnArgument) {
console.log('this will never work');
}