简体   繁体   English

如何使用 nodejs 更新和删除产品评论

[英]How to update and delete a review of a product using nodejs

I am creating a e-commerce app and now I want to update and delete a review of a product using nodejs and database is mongoDB (using mongoose).我正在创建一个电子商务应用程序,现在我想使用 nodejs 更新和删除对产品的评论,数据库是 mongoDB(使用 mongoose)。 This is my User Schemas and Product Schema:这是我的用户模式和产品模式:

const userSchema = new Schema(
  {
    name: { type: String, required: true },
    email: { type: String, required: true, unique: true, trim: true },
    password: { type: String, required: true, trim: true },
    isAdmin: { type: Boolean, required: true, default: false },
  },
  {
    timestamps: true,
  }
);

const productSchema = new Schema({
  user: {
    type: Schema.Types.ObjectId,
    required: true,
    ref: "users",
  },
  name: { type: String, required: true },
  image: { type: String, required: true },
  brand: { type: String, required: true },
  category: { type: String, required: true },
  description: { type: String, required: true },
  reviews: [
    {
      name: { type: String, required: true },
      rating: { type: Number, required: true },
      comment: { type: String, required: true },
      user: {
        type: Schema.Types.ObjectId,
        required: true,
        ref: "users",
      },
    },
    {
      timestamps: true,
    },
  ],
  rating: { type: Number, required: true, default: 0 },
  reviewNumber: { type: Number, required: true, default: 0 },
  price: { type: Number, required: true, default: 0 },
  countInStock: { type: Number, required: true, default: 0 },
});

I completed the create function but I don't know how to implement update and delete function, this this my create function:我完成了创建功能,但我不知道如何实现更新和删除功能,这是我的创建功能:

//* desc   Create review
//* route  POST /product/:id/review
//* access Private
const createReview = async (req, res) => {
  const { rating, comment } = req.body;

  if (!rating || !comment) {
    return res.status(400).json({
      success: false,
      message: "Missing infomation",
    });
  }

  try {
    const product = await Product.findById(req.params.id);

    if (!product) {
      return res.status(400).json({
        success: false,
        message: "Product is not found",
      });
    }

    const review = product.reviews;

    const alreadyReviewed = product.reviews.find(
      (i) => i.user.toString() === req.user._id.toString()
    );

    if (alreadyReviewed) {
      return res.status(400).json({
        success: false,
        message: "User have already reviewed this product",
      });
    }

    const newReview = {
      name: req.user.name,
      rating: 0 || Number(rating),
      comment,
      user: req.user._id,
    };

    review.push(newReview);
    product.reviewNumber = review.length;
    product.rating =
      review.reduce((acc, item) => item.rating + acc, 0) / review.length;

    await product.save();

    return res.status(200).json({
      success: true,
      message: "Create review successfully",
      product,
    });
  } catch (error) {
    console.log(error);
    return res.status(500).json({
      success: false,
      message: "Internal server error",
    });
  }
};

So how can I implement update and delete function?那么如何实现更新和删除功能呢?

I am assuming according to your code one product can have only one review per user.我假设根据您的代码,一个产品每个用户只能有一个评论。

//* desc update review
//* route  PUT /product/:id/review
//* access Private
const createReview = async (req, res) => {
  const { rating, comment  } = req.body;

  if (!rating || !comment) {
    return res.status(400).json({
      success: false,
      message: "Missing infomation",
    });
  }

  try {
    const product = await Product.findById(req.params.id);

    if (!product) {
      return res.status(400).json({
        success: false,
        message: "Product is not found",
      });
    }

    const reviews = product.reviews;
    
    const foundReviewIndex = product.reviews.findIndex(
      (i) => i.user.toString() === req.user._id.toString()
    );

    if (foundReviewIndex === -1) {
      return res.status(400).json({
        success: false,
        message: "Review not found",
      });
    }

    reviews[foundReviewIndex].rating = rating ? Number(rating) : 0,
    reviews[foundReviewIndex].comment = comment,

    product.rating =
      review.reduce((acc, item) => item.rating + acc, 0) / review.length;

    await product.save();

    return res.status(200).json({
      success: true,
      message: "Updated review successfully",
      product,
    });
  } catch (error) {
    console.log(error);
    return res.status(500).json({
      success: false,
      message: "Internal server error",
    });
  }
};

Similarly, you can write a function for deleting a review.同样,您可以编写一个删除评论的函数。 I suggest you create a separate collection for reviews and keep both product and user references in the review schema.我建议您为评论创建一个单独的集合,并将产品和用户引用保留在评论模式中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM