.save() 无法使用 async/await 正确保存到 mongoDB

Posted

技术标签:

【中文标题】.save() 无法使用 async/await 正确保存到 mongoDB【英文标题】:.save() not correctly saving to mongoDB with async/await 【发布时间】:2021-09-07 10:49:36 【问题描述】:

我在重构用于创建“帖子”的函数时遇到问题,然后将其保存给“用户”。它适用于 .then() 语法,但我似乎无法弄清楚如何使用 async/await 使其工作。

帖子已创建,当我查看应该将其保存到的用户时,帖子 ID 会显示在用户身上。但是,帖子在创建时永远不会获得对用户 ID 的引用。这是我目前拥有的。

  const create = async (req, res) => 
  const userId = req.params.id;
  try 
    const foundUser = await db.User.findById(userId);
    const createdPost = await db.Post.create(req.body);
    foundUser.posts.push(createdPost._id);
    await foundUser.save((err) => 
      if (err) return console.log(err);
    );
    res.json( post: createdPost );
   catch (error) 
    if (error) console.log(error);
    res.json( Error: "No user found.")
  

编辑:根据要求,这是我的帖子架构的 sn-p。

    const mongoose = require("mongoose");
    
    const Schema = mongoose.Schema;
    
    const postSchema = new Schema(
      
        title: 
          type: String,
          required: true,
          maxlength: 100,
        ,
        description: 
          type: String,
          maxlength: 300,
        ,
        date: 
          type: Date,
          default: Date.now(),
        ,
        user: 
          type: mongoose.Schema.Types.ObjectId,
          ref: "User",
        ,
        comments: [
          
            type: mongoose.Schema.Types.ObjectId,
            ref: "Comment",
          ,
        ],
      ,
       timestamps: true 
    );
    
    const Post = mongoose.model("Post", postSchema);
    
    module.exports = Post;

【问题讨论】:

添加等待 await foundUser.posts.push(createdPost._id); 您能与我们分享您的架构代码吗?您是否在 Post 架构中创建了 ref: User? 这是我用来在 Post 模式上引用我的用户模式的方法:user: type: mongoose.Schema.Types.ObjectId, ref: "User", , @selcuk 我尝试在 .push 行上添加等待,但它似乎没有工作...... foundUser.save() 如果你传递一个回调函数,not 会返回一个 promise..."Returns undefined if used with callback or a Promise otherwise." 【参考方案1】:

问题可能出在此处,您正在保存文档,但由于您传递的是回调函数,因此此处的 await 什么也不做,因此您的代码不会等待响应。

await foundUser.save((err) => 
  if (err) return console.log(err);
);

这里也没有必要捕获任何错误,因为您正在尝试捕获,所以这里正确的代码行是 await foundUser.save()

【讨论】:

【参考方案2】:

所以,我决定回顾一下我在使用 .then() 时执行此函数的方式,我注意到有一行我起初认为是不必要的。找到用户后我添加了req.body.user = userId。然后,这给了我在我的帖子上对用户的引用。所以,我用我的 async-await 版本尝试了这个,它成功了!不过,我不确定这是否是解决此问题的“正确”方式。

下面我已经包含了工作代码:

const create = async (req, res) => 
  const userId = req.params.id;
  try 
    const foundUser = await db.User.findById(userId);
    req.body.user = userId;
    const createdPost = await db.Post.create(req.body);
    foundUser.posts.push(createdPost._id);
    await foundUser.save();
    res.json( post: createdPost );
   catch (error) 
    if (error) console.log(error);
    res.json( Error: "No user found.")
  

【讨论】:

以上是关于.save() 无法使用 async/await 正确保存到 mongoDB的主要内容,如果未能解决你的问题,请参考以下文章

nestjs 有或没有 async/await 有区别吗?

Rollup 无法转译 async/await - regeneratorRuntime 未定义

无法理解 async/await nodejs

调试 .NET Async/Await 函数时无法检查变量

如何测试使用 async/await 的方法?

async 和 await