将回调代码改进为异步等待猫鼬
Posted
技术标签:
【中文标题】将回调代码改进为异步等待猫鼬【英文标题】:Improve callback code into async await mongoose 【发布时间】:2020-12-21 19:23:19 【问题描述】:我想用 async/await 方法改进我在 mongose 中的旧回调代码(这些方法更易于阅读和组织)
PUT 是问题
我有一个 findById,它是正确的
问题是尝试使用 await user.save(userWithNewProps)
更新文档时
// put
app.put('/:id', async (req, res) =>
try
const user = await User.findById(req.params.id).exec()
if (user === null) return res.status(404).json(null)
const userWithNewProps = name: 'Homer', lastame: 'Simpson'
const userUpdated = await user.save(userWithNewProps) // Doesn't works!
res.status(200).json(userUpdated)
catch (e)
return res.status(500).json(e)
)
我尝试学习许多教程和其他问题,但对我来说有些困难。 你能检查我的错误吗?
回调地狱
这是原始的回调代码,可以正常使用,但是是回调地狱和恶魔:
// put
app.put(
'/:id',
(req, res) =>
User.findById(req.params.id, (err, userFound) =>
if (err)
return res.status(500).json(err);
if (!userFound)
return res.status(404).json(err);
userFound.name = 'Homer';
userFound.lastname = 'Simpson';
userFound.save((err, userUpdated) =>
if (err)
return res.status(500).json(err);
res.status(200).json(userUpdated);
);
);
);
非常感谢
【问题讨论】:
什么不起作用?保存还是更新? 查看 const userWithNewProps = name: 'Homer': lastame: 'Simpson' => const userWithNewProps = name: 'Homer', lastame: 'Simpson' 中的 ',' 参数 @BinaryMan 更新是问题 @BinaryMan ,抱歉,homer simpson 中的逗号 (',') 仅用于示例 好的,试试这个:user.name = 'Homer'; user.lastname = '辛普森'; user.markModified('name'); user.markModified('姓氏');等待用户.save(); 【参考方案1】:从我们在 cmets 的讨论中了解到,问题出在更新而不是保存数据时,因此您需要通知 Mongoose 的更改跟踪。
可以使用 markModified() method 通知 Mongoose 更改,并且应该在保存之前。
user.name = 'Homer';
user.lastname = 'Simpson';
user.markModified('name');
user.markModified('lastname');
await user.save();
问候:)
【讨论】:
如果没有这些,为什么回调样式的代码可以工作?以上是关于将回调代码改进为异步等待猫鼬的主要内容,如果未能解决你的问题,请参考以下文章