node.js中间件使代码同步

时间:2018-07-10 06:37:51

标签: node.js express middleware

我正在尝试在每个页面上提供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);
        })
    })
};

1 个答案:

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