【问题标题】:Proper way to two .save() in mongoose猫鼬中两个 .save() 的正确方法
【发布时间】:2021-05-11 14:02:07
【问题描述】:

我试图在同一个函数中保存到两个不同的文档和两个不同的模型,但无论我尝试什么,我似乎都会遇到奇怪的错误。似乎无论出于何种原因,mongoose 都完全无法正常工作。

我有两个嵌套的 findOne 函数,一个是查找书,另一个是查找教授,目标是更新它们以相互关联。

有没有推荐的方法我应该这样做,也许是两个单独的后端端点和两个单独的函数?那将是解决此问题的一种方法,但我想知道为什么我不能执行以下操作。

await prof.save().then(async () => {
      await book
            .save()
            .then(() => {
                return res.status(200).json({
                   success: true,
                   message: 'items updated'
             }).catch( (err) => {
                 return res.status(400)
             })
      })
})

【问题讨论】:

    标签: node.js reactjs express mongoose save


    【解决方案1】:

    首先你不能同时使用await .then .catch。如果你想在 mongoose 中更新两个或更多集合,最好使用transactions,就像关系数据库中的rollback,但如果你是 mongoose 的新手,则很难实现事务, 没有交易你可以这样做

    
    try {
     await prof.save();
     await book.save();
     return res.status(200).json({
       success: true,
       message: "items updated",
    });
    } catch (error) {
       return res.status(400)
    }
    

    【讨论】:

      【解决方案2】:

      您可能想看看Mongoose's documentation 的中间件,尤其是关于pre .save() 中间件的部分。 您要做的是在每次保存项目时触发一些功能。特别是,您希望此功能本身是另一个保存功能。这需要在您的 Profs Schema 中完成,并且您需要要求您的 Books 模型使其工作:

      ProfsSchema.pre('save', async function (next) {
        const prof = this;
        try {
          await Books.findOneAndUpdate({ ... });
          next();
        } catch (e) {
          throw e;
        }
      })
      

      当然,这是一个非常示意性的建议:{ ... } 代表您想要应用于图书文档的任何更新。此外,无论是使用 if (prof.isNew) 创建新的 prof 文档还是仅在修改某些字段 if (prof.field.isModified) 时才触发这些功能,您可能想要做不同的事情。 无论如何,我强烈建议您学习使用 Mongoose 的中间件来实现这种目的:它是一个相当强大的工具,可以跨 MongoDB 集群互连不同的模型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-20
        • 2020-08-01
        • 2017-03-28
        • 2016-01-23
        • 2021-07-14
        • 2021-02-10
        • 2016-11-06
        • 1970-01-01
        相关资源
        最近更新 更多