#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();