猫鼬不将对象插入数组

Posted

技术标签:

【中文标题】猫鼬不将对象插入数组【英文标题】:Mongoose don't insert object into array 【发布时间】:2022-01-07 14:16:16 【问题描述】:

我有一个简单的快速应用程序,可以将 cmets 插入帖子,问题是 cmets 从未插入,但通过邮递员发布时没有显示错误,它正确返回帖子但没有 cmets。 试试看:this 和 this 但似乎不起作用

这是我的架构

interface PostAttrs 
  userid: mongoose.Schema.Types.ObjectId;
  username: string;
  date: Date;
  text: string;
  image: string;
  comments: Array<any>;
  likes?: number;


const postSchema = new Schema<PostAttrs>(
  userid: 
    type: mongoose.Schema.Types.ObjectId,
    required: true,
  ,
  username: 
    type: String,
    required: true,
  ,
  date: 
    type: Date,
    required: true,
  ,
  text: 
    type: String,
    required: true,
  ,
  image: 
    type: String,
    required: false,
  ,

  comments: [
    
      required: false,
      date: 
        type: String,
        required: true,
      ,
      user: 
        type: Schema.Types.ObjectId,
        ref: 'User',
        required: true,
      ,
      text: 
        type: String,
        required: true,
      ,
    ,
  ],

  likes: 
    type: Number,
    required: true,
  ,
);

还有 API 路由

export const createComment = async (req: Request, res: Response) => 
  try 
    const postId = req.params.postId;
    const userId = req.params.userId;
    const comment = req.body.comment;
    var commentObj = 
      date: new Date(),
      userId: userId,
      text: comment
    ;
    await Post.findOneAndUpdate(
       _id: postId , 
       new: true ,
      $push: 
        comments:  commentObj 
      ,
      (err: any, doc: any) => 
        if (err) 
          console.log("Something wrong when updating data!");
        
        console.log(doc);
        return res.status(200).send(doc);
      
      );

   catch (error)  

我的代码有什么问题?

【问题讨论】:

【参考方案1】:

已解决:问题是 findOneAndUpdate() 语句中参数的顺序,首先是搜索条件,其次是要更新的值,最后是语句。所以我不得不改变这个

await Post.findOneAndUpdate(
       _id: postId , 
       new: true ,
      $push: 
        comments:  commentObj 
      ,
      (err: any, doc: any) => 
        if (err) 
          console.log("Something wrong when updating data!");
        
        console.log(doc);
        return res.status(200).send(doc);
      );

await Post.findOneAndUpdate(
       _id: postId , 
      $push: 
        comments:  commentObj 
      ,
       new: true ,
      (err: any, doc: any) => 
        if (err) 
          console.log("Something wrong when updating data!");
        
        console.log(doc);
        return res.status(200).send(doc);
      );

【讨论】:

【参考方案2】:

当使用 'await' 和 Mongoose 的方法(如 findOneAnd....)时,除非您明确这样做,否则该方法不会运行。

试试:

await Post.findOneAndUpdate(......).exec();

此外,当使用 await 关键字时,您可以重构并删除回调

【讨论】:

以上是关于猫鼬不将对象插入数组的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬不发送更新的结果[重复]

猫鼬不发送更新的结果[重复]

为啥猫鼬不更新?

猫鼬不按名称识别集合[重复]

猫鼬不创建文档

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