Express 中间件被多次调用
Express middleware getting called many times
app.use(function(req, res, next) {
var chatlog = [];
console.log('executed many timews why?')
var chatlog = redisClient.lrange('messages', 0, 99, function(err, reply) {
if (!err) {
var result = [];
for (var msg in reply) result.push(JSON.parse(reply[msg]));
if (result.length == 0) {
result.push({
"msg": 'welcome',
"nickname": "guest1"
})
}
console.log(result)
} else {
console.log('error getting chat messages')
}
res.locals = {
chatlog: result
};
next();
return
});
app.get('/', (req, res) => {
res.render('index', { })
})
当我访问“/”一次时,控制台打印如下:
executed many timews why
[ { msg: 'welcome', nickname: 'guest1' } ]
executed many timews why
executed many timews why
executed many timews why
executed many timews why
[ { msg: 'welcome', nickname: 'guest1' } ]
[ { msg: 'welcome', nickname: 'guest1' } ]
[ { msg: 'welcome', nickname: 'guest1' } ]
[ { msg: 'welcome', nickname: 'guest1' } ]
executed many timews why
executed many timews why
[ { msg: 'welcome', nickname: 'guest1' } ]
[ { msg: 'welcome', nickname: 'guest1' } ]
executed many timews why
[ { msg: 'welcome', nickname: 'guest1' } ]
如何让我的中间件只执行一次?如果我拿走 next,它只运行一次但页面不会加载,如果我保留 next(),它会执行很多次。
您的中间件已设置为针对每个请求进行调用。这意味着如果 Express 配置不正确,它将为您碰巧在索引模板中使用的每个图像、样式表或 JS 文件调用它。
如果这些文件由 express.static
提供,请确保在 express.static
声明之后加载您的中间件:
app.use(express.static(...));
app.use(...your middleware...);
app.get('/', ...);
这样,您的中间件就不会被静态资源调用,因为 express.static
会在您的中间件之前处理它们。
您还可以创建一个单独的中间件函数并将其插入到特定路由中:
let myMiddleware = function(req, res, next) {
...
});
app.get('/', myMiddleware, function(req, res) {
res.render('index', {})
});
app.use(function(req, res, next) {
var chatlog = [];
console.log('executed many timews why?')
var chatlog = redisClient.lrange('messages', 0, 99, function(err, reply) {
if (!err) {
var result = [];
for (var msg in reply) result.push(JSON.parse(reply[msg]));
if (result.length == 0) {
result.push({
"msg": 'welcome',
"nickname": "guest1"
})
}
console.log(result)
} else {
console.log('error getting chat messages')
}
res.locals = {
chatlog: result
};
next();
return
});
app.get('/', (req, res) => {
res.render('index', { })
})
当我访问“/”一次时,控制台打印如下:
executed many timews why
[ { msg: 'welcome', nickname: 'guest1' } ]
executed many timews why
executed many timews why
executed many timews why
executed many timews why
[ { msg: 'welcome', nickname: 'guest1' } ]
[ { msg: 'welcome', nickname: 'guest1' } ]
[ { msg: 'welcome', nickname: 'guest1' } ]
[ { msg: 'welcome', nickname: 'guest1' } ]
executed many timews why
executed many timews why
[ { msg: 'welcome', nickname: 'guest1' } ]
[ { msg: 'welcome', nickname: 'guest1' } ]
executed many timews why
[ { msg: 'welcome', nickname: 'guest1' } ]
如何让我的中间件只执行一次?如果我拿走 next,它只运行一次但页面不会加载,如果我保留 next(),它会执行很多次。
您的中间件已设置为针对每个请求进行调用。这意味着如果 Express 配置不正确,它将为您碰巧在索引模板中使用的每个图像、样式表或 JS 文件调用它。
如果这些文件由 express.static
提供,请确保在 express.static
声明之后加载您的中间件:
app.use(express.static(...));
app.use(...your middleware...);
app.get('/', ...);
这样,您的中间件就不会被静态资源调用,因为 express.static
会在您的中间件之前处理它们。
您还可以创建一个单独的中间件函数并将其插入到特定路由中:
let myMiddleware = function(req, res, next) {
...
});
app.get('/', myMiddleware, function(req, res) {
res.render('index', {})
});