将回调代码改进为异步等待猫鼬

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

问候:)

【讨论】:

如果没有这些,为什么回调样式的代码可以工作?

以上是关于将回调代码改进为异步等待猫鼬的主要内容,如果未能解决你的问题,请参考以下文章

在猫鼬中执行 CRUD 操作时异步/等待

Javascript异步等待不等待猫鼬等待

猫鼬 findById 的异步/等待行为

猫鼬不等待在回调中传递文档

异步回调CompletableFuture

带有异步操作的猫鼬游标