我正在尝试在每个页面上提供res.locals.info
。
我正在尝试通过中间件执行此操作,但出现错误。
呈现页面时,显然res.locals.info尚未准备就绪,因此出现错误info is not defined
。我该如何解决?
app.use(function(req,res,next){
async function getInfo(user) {
let result = await info.search(user);
setInfo(result);
}
function setInfo(result){
res.locals.info= result;
}
getInfo(req.user);
return next();
})
search():
module.exports.search= function (user) {
var query=`SELECT count(*) as Info from dbo.InfoUsers WHERE user= '${user}' ;`
return new Promise((resolve, reject) => {
sequelize
.query(`${query}`, {model: InformationUser})
.then((info) => {
resolve(info);
})
})
};
答案 0 :(得分:0)
您在next()
函数完成工作之前就在调用getInfo()
,因此在尝试使用res.locals.info
时尚未设置它。
一个async
函数返回一个Promise。在await
完成之前,它不会阻塞。相反,它立即返回一个承诺。您将需要在await
上使用.then()
或getInfo()
,以便知道它何时真正完成。
如果info.search()
返回的承诺可以解决所需的结果,那么您可以这样做:
app.use(function(req,res,next){
// this returns a promise that resolves when it's actually done
async function getInfo(user) {
let result = await info.search(user);
setInfo(result);
}
function setInfo(result){
res.locals.info= result;
}
// use .then() to know when getInfo() is done
// use .catch() to handle errors from getInfo()
getInfo(req.user).then(result => next()).catch(next);
});
而且,您可以从搜索功能中删除deferred anti-pattern并修复错误处理(这是使用反模式时的常见问题)。无需将现有的承诺包装在另一个承诺中。
module.exports.search = function (user) {
var query=`SELECT count(*) as Info from dbo.InfoUsers WHERE user= '${user}' ;`
// return promise directly so caller can use .then() or await on it
return sequelize.query(`${query}`, {model: InformationUser});
};