node.js中间件使代码同步
我正试图使node.js中间件使代码同步,node.js,express,middleware,Node.js,Express,Middleware,我正试图使res.locals.info在每一页上都可用。 我试图通过中间件来实现这一点,但我遇到了一个错误。 显然res.locals.info在页面呈现时还没有准备好,因此我得到了一个错误info未定义。我如何解决这个问题 app.use(function(req,res,next){ async function getInfo(user) { let result = await info.search(user); setInfo(result); }
res.locals.info
在每一页上都可用。
我试图通过中间件来实现这一点,但我遇到了一个错误。
显然res.locals.info在页面呈现时还没有准备好,因此我得到了一个错误info未定义
。我如何解决这个问题
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();
})
搜索():
在
getInfo()
函数完成工作之前,您正在调用next()
,因此当您尝试使用它时,res.locals.info
尚未设置
async
函数返回一个承诺。直到等待
完成后,它才会阻塞。相反,它会立即返回一个承诺。您需要在getInfo()
上使用wait
或.then()
,以便知道实际完成的时间
如果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);
});
而且,您可以从搜索函数中删除,并修复错误处理(这是使用反模式时的常见问题)。无需将现有承诺封装在另一个承诺中:
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});
};
您没有向我们展示足够的代码,我们无法提供适当的建议。例如,您显示了一个函数调用
search(req.user)
,这是您在中间件中调用的除next()
之外的唯一函数,但您没有显示该函数的代码。我们需要看到这一点。另外,您定义了getInfo()
,但不显示调用它的任何位置。并且,请使用适当的缩进设置代码的格式,以便更容易阅读代码。我的意思是在返回下一步()之前使用getInfo()而不是search();。我编辑了它,所以你不需要查看信息。搜索(用户);代码。它只是从数据库中检索结果。info.search()
是否返回解析为所需结果的承诺?否则,wait
将不会得到结果。我建议不要告诉我们该做什么,也不需要看。这里的许多问题都是由于提问者的错误假设造成的,因此我们需要测试这些假设,最快、最可靠的方法是让我们查看所有相关的代码。@alexis-我添加了一个更简单、更固定的搜索函数版本(向我们展示代码的好处)。@alexis-这能为您解释吗?如果是这样的话,您可以通过单击答案左侧的复选标记向社区表明这一点,并且您还将因为遵循正确的堆栈溢出过程而获得一些声誉点数。
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});
};