我对这个感到困惑。首先,这是我的代码:
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,它将返回更改的对象。
答案 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,
});
});