EDGAR MEDINA
EDGAR MEDINA

Reputation: 121

Mongoose don't insert object into array

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?

Upvotes: 0

Views: 562

Answers (2)

user3067684
user3067684

Reputation: 1258

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

Upvotes: 1

EDGAR MEDINA
EDGAR MEDINA

Reputation: 121

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

Upvotes: 2

Related Questions