Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
node.js中间件使代码同步_Node.js_Express_Middleware - Fatal编程技术网

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});
};