Ошибка промежуточного программного обеспечения запроса Мангуста(запрос уже выполнен)

#mongodb #mongoose #mongoose-middleware

Вопрос:

Когда я выполняю эту модель,я получаю ошибку. Пожалуйста, решите этот вопрос. Эта проблема вызвала у меня головную боль. В отличие от использования «Контент здесь, контент здесь», чтобы он выглядел как читаемый английский, многие пакеты настольных издательств и редакторы веб-страниц теперь используют «Lorem Ipsum» в качестве текста модели по умолчанию, и поиск «Lorem Ipsum» откроет многие веб-сайты, которые все еще находятся в зачаточном состоянии. Различные версии развивались на протяжении многих лет.

 const mongoose = require("mongoose");
const Product = require("./shopingModel");

const reviewSchema = new mongoose.Schema({
  createdAt: {
    type: Date,
    default: Date.now(),
  },
  review: {
    type: String,
    required: [true, "A review should not be empty"],
  },
  rating: {
    type: Number,
    min: [1, "rating shount below 1"],
    max: [5, "rating must be below 5.0"],
  },
  user: {
    type: mongoose.Schema.ObjectId,
    ref: "User",
    required: [true, "A review must belong a user"],
  },
  product: {
    type: mongoose.Schema.ObjectId,
    ref: "Product",
    required: [true, "A review must belong a product"],
  },
});

reviewSchema.pre(/^findOne/, function (next) {
  this.populate("user", "name").populate("product", "title price");

  next();
});

reviewSchema.statics.calcAverageRatings = async function (productId) {
  const stats = await this.aggregate([
    {
      $match: { product: productId },
    },
    {
      $group: {
        _id: "$product",
        numRating: { $sum: 1 },
        avgRating: { $avg: "$rating" },
      },
    },
  ]);
  await Product.findByIdAndUpdate(productId, {
    ratingsAverage: stats[0].avgRating,
    ratingsQuantity: stats[0].numRating,
  });
};

reviewSchema.post("save", async function () {
  await this.constructor.calcAverageRatings(this.product);
});

reviewSchema.pre(/^findOneAnd/, async function (next) {
  this.r = await this.findOne();
  // console.log(this.r);
  next();
});

reviewSchema.post(/^findOneAnd/, async function () {
  // await this.findOne(); does NOT work here, query has already executed
  const model = this.r.constructor;
  await model.calcAverageRatings(this.r.tour);
});

const Review = mongoose.model("Review", reviewSchema);

module.exports = Review;
 

когда я запускаю calcAverageRatings на промежуточном программном обеспечении, я получил это

 "status": "error",
"error": {
    "originalStack": "Errorn    at model.Query._wrappedThunk [as _findOne] (C:\Users\grixx\Desktop\Practice\node_modules\mongoose\lib\helpers\query\wrapThunk.js:25:28)n    at C:\Users\grixx\Desktop\Practice\node_modules\kareem\index.js:279:20n    at _next (C:\Users\grixx\Desktop\Practice\node_modules\kareem\index.js:103:16)n    at C:\Users\grixx\Desktop\Practice\node_modules\kareem\index.js:508:38n    at processTicksAndRejections (internal/process/task_queues.js:77:11)",
    "status": "error",
    "statusCode": 500
},
"message": "Query was already executed: Review.findOne({ _id: new ObjectId("615d82ac971aae7627c5a1b9...",
"stack": "MongooseError: Query was already executed: Review.findOne({ _id: new ObjectId("615d82ac971aae7627c5a1b9...n    at model.Query._wrappedThunk [as _findOneAndDelete] (C:\Users\grixx\Desktop\Practice\node_modules\mongoose\lib\helpers\query\wrapThunk.js:21:19)n    at C:\Users\grixx\Desktop\Practice\node_modules\kareem\index.js:279:20n    at _next (C:\Users\grixx\Desktop\Practice\node_modules\kareem\index.js:103:16)n    at C:\Users\grixx\Desktop\Practice\node_modules\kareem\index.js:508:38n    at processTicksAndRejections (internal/process/task_queues.js:77:11)"
 

Ответ №1:

Используйте this.r = await this.clone().findOne(); вместо this.r = await this.findOne();