获取变量到外部范围

时间:2018-03-23 23:03:19

标签: javascript node.js

我对这个感到困惑。首先,这是我的代码:

router.post('/update', (req, res, next) => {
  // Todo legit credit card holding
  Account.findOneAndUpdate(
    { _id: req.user._id },
    {
      $set: {
        // username: req.body.username,
        creditCardNo: req.body.cardNo,
        isPremium: true,
      },
    },
    { upsert: true },
    (err, doc) => {
      if (err) {
        console.log(err);
      }
    }
  );
  var newUser;
  Account.findById(req.user._id,(err, doc)=>{
    if(err){
      console.log(err);
    }
    else{
      newUser = doc;
    }
  });
  console.log(newUser);
  res.render('user-pannel/pannel', {
    title: 'User pannel',
    user: newUser,
  });
});

它的作用是:它获得POST调用并更新数据库中的记录。现在我想基本上重新加载页面(res.render部分)并发送新的用户对象。

我需要发送新的,因为req.user中的那个现在已经过时(之前已更新,我只是打印旧版本)。

我尝试通过执行此newUser = doc;来解决问题,但由于某种原因,newUser变量在findById方法之外记录时未定义。为什么?如果我控制台记录findById方法内的doc,它将返回更改的对象。

1 个答案:

答案 0 :(得分:1)

我把它变成了异步函数,await用它所需的值来解析它的分辨率。



router.post('/update', async (req, res, next) => {
  // Todo legit credit card holding
  Account.findOneAndUpdate(
    { _id: req.user._id },
    {
      $set: {
        // username: req.body.username,
        creditCardNo: req.body.cardNo,
        isPremium: true,
      },
    },
    { upsert: true },
    (err, doc) => {
      if (err) {
        console.log(err);
      }
    }
  );
  const newUser = await new Promise((resolve, reject) => {
    Account.findById(req.user._id,(err, doc) => {
      if(err) reject(err);
      else resolve(doc);
    });
  });
  console.log(newUser);
  res.render('user-pannel/pannel', {
    title: 'User pannel',
    user: newUser,
  });
});