Home > front end >  Mongoose don't insert object into array
Mongoose don't insert object into array

Time:12-01

I have a simple express application that insets comments into posts, the issue is that the comments are never inserted but no errors are shown when post via postman it properly returns the post but with no comments. Just try: this and this but seems to not working

This is my schema

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,
  },
});

And the API route

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) { }
}

What's wrong with my code?

CodePudding user response:

SOLVED: The problem was the order of the parameters in the findOneAndUpdate() sentence, first the search condition, next, the value to update, and finally the statement. So I had to change this

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);
      });

to

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);
      });

CodePudding user response:

When using 'await' with Mongoose's methods like findOneAnd.... the method is not run unless you explicitly do so.

Try:

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

Also when using the await keyword you can refactor and remove the callbacks

  • Related