【问题标题】:.save() not correctly saving to mongoDB with async/await.save() 无法使用 async/await 正确保存到 mongoDB
【发布时间】: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."

标签: javascript node.js mongodb mongoose async-await


【解决方案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."})
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 2017-11-23
      • 2018-05-07
      相关资源
      最近更新 更多