.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的主要内容,如果未能解决你的问题,请参考以下文章