0

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?

2 Answers 2

2

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);
      });
Sign up to request clarification or add additional context in comments.

Comments

1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.