Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么虚拟填充不能在节点js和mongoose上工作?场景:产品和用户审查_Javascript_Node.js_Mongodb_Mongodb Query_Mongoose Populate - Fatal编程技术网

Javascript 为什么虚拟填充不能在节点js和mongoose上工作?场景:产品和用户审查

Javascript 为什么虚拟填充不能在节点js和mongoose上工作?场景:产品和用户审查,javascript,node.js,mongodb,mongodb-query,mongoose-populate,Javascript,Node.js,Mongodb,Mongodb Query,Mongoose Populate,我有评论和产品模型。如果用户对特定产品(id)进行评论,那么它将存储在评论模型数据库中,但我不喜欢将用户评论存储在产品模型数据库中。因此,我在产品模型中使用虚拟填充,而不是子引用。使用虚拟属性后,如果我们使用产品id查看详细信息,我们可以看到json格式的用户评论,但没有保存在数据库中。但问题是我的虚拟属性(在产品模型中)不起作用,因为当我以该产品id发送请求时,它没有以json格式显示对用户的评论,而该产品id已经由用户进行了评论(存储在评论模型数据库中)。这里有什么问题 用户对数据库中存储的

我有评论和产品模型。如果用户对特定产品(id)进行评论,那么它将存储在评论模型数据库中,但我不喜欢将用户评论存储在产品模型数据库中。因此,我在产品模型中使用虚拟填充,而不是子引用。使用虚拟属性后,如果我们使用产品id查看详细信息,我们可以看到json格式的用户评论,但没有保存在数据库中。但问题是我的虚拟属性(在产品模型中)不起作用,因为当我以该产品id发送请求时,它没有以json格式显示对用户的评论,而该产品id已经由用户进行了评论(存储在评论模型数据库中)。这里有什么问题

用户对数据库中存储的产品(id)的审核

发送该产品id的请求,以查看使用虚拟属性的json格式的用户评论(但在json中未找到评论)

在产品模型中

const productSchema = new Schema({

    name: {
        type: String,
        required: true,
        trim: true,
    },

    slug: {
        type: String,
        required: true,
        unique: true,
    },
    price: {
        type: String,
        required: true,
    },
    quantity: {
        type: Number,
        required: true,
    },
    description: {
        type: String,
        required: true,
        trim: true,
    },
    offer: {
        type: Number,
    },
    discount: {
        type: Number,
    },
    productPictures: [{
        img: {
            type: String,
        },
    }, ],

   
    mainCategory: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "category",
        required: [true, "It is a required field"],
    },
    sub1Category: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "category",
        required: [true, "It is a required field"],
    },
    sub2Category: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "category",
        required: [true, "It is a required field"],
    },
    createdBy: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "admin",
        required: true,
    },
    vendor: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "vendor",
    },
    createdAt: {
        type: String,
        default: moment().format("DD/MM/YYYY") + ";" + moment().format("hh:mm:ss"),
    },
    updatedAt: {
        type: String,
        default: moment().format("DD/MM/YYYY") + ";" + moment().format("hh:mm:ss"),
    },
},

{
    toJson: { virtuals: true },
    toObject: { virtuals: true },
}
);

    productSchema.virtual("reviews", {

ref: "review",

foreignField: "product",

localField: "_id",

// justOne: true
}); 

const Product = mongoose.model("product", productSchema);                   
           module.exports = Product;
审查中的模式

const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const moment = require("moment");



const reviewSchema = new Schema({

user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "user",
    required: [true, "Review must belong to user"],
},
product: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "product",
    required: [true, "Review must belong to the product"],
},
review: {
    type: String,
    required: [true, "Review cannot be empty"],
},
rating: {
    type: Number,
    min: 1,
    max: 5,
},
createdAt: {
    type: String,
    default: moment().format("DD/MM/YYYY") + ";" + moment().format("hh:mm:ss"),
},
updateddAt: {
    type: String,
    default: moment().format("DD/MM/YYYY") + ";" + moment().format("hh:mm:ss"),
},
}, {
toJson: { virtuals: true },
toObject: { virtuals: true },
});


// pre middleware and populating user and product(we can also do populate in getAllReview in controller)

reviewSchema.pre(/^find/, function(next) {
// ^find here is we use regex and can able to find,findOne ...etc
this.populate({
    path: "product",
    select: " _id name",
}).populate({
    path: "user",
    select: " _id fullName",
});
next()
});


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

module.exports = Review;
In Review.js

const Review = require("../../models/Review.Models")
exports.createReview = async(req, res) => {
const review = await Review.create(req.body)

return res.status(201).json({
    status: true,
    review
})
}


exports.getAllReviews = async(req, res) => {
try {
    const reviews = await Review.find()

    return res.status(200).json({
        status: true,
        totalReviews: reviews.length,
        reviews
    })
} catch (error) {
    return res.status(400).json({
        status: false,
        error
    })
}}
在Product.js中

const Product = require("../../models/Product.Models");
exports.getProductDetailsById = async(req, res) => {
try {
    const { productId } = req.params;

    // const { productId } = req.body;

    if (productId) {
        const products = await Product.findOne({ _id: productId })
            .populate('reviews')

        return res.status(200).json({
            status: true,
            products,
        });
    } else {
        console.log("error display");
        return res.status(400).json({
            status: false,
            error: "params required...",
        });
    }
} catch (error) {
    return res.status(400).json({
        status: false,

        error: error,
    });
}
 try {
if (productId) {
  const products = await Product.findOne({ _id: productId }).populate(
    "reviews"
  );


  console.log(products);
  if (products) {
    return res.status(200).json({
      status: true,
      message: "Products is listed",
      products,
      reviw: products.reviews,
    });
在Product.js中试试这个

const Product = require("../../models/Product.Models");
exports.getProductDetailsById = async(req, res) => {
try {
    const { productId } = req.params;

    // const { productId } = req.body;

    if (productId) {
        const products = await Product.findOne({ _id: productId })
            .populate('reviews')

        return res.status(200).json({
            status: true,
            products,
        });
    } else {
        console.log("error display");
        return res.status(400).json({
            status: false,
            error: "params required...",
        });
    }
} catch (error) {
    return res.status(400).json({
        status: false,

        error: error,
    });
}
 try {
if (productId) {
  const products = await Product.findOne({ _id: productId }).populate(
    "reviews"
  );


  console.log(products);
  if (products) {
    return res.status(200).json({
      status: true,
      message: "Products is listed",
      products,
      reviw: products.reviews,
    });
只需要添加响应发送

 return res.status(200).json({
      status: true,
      message: "Products is listed",
      products,
      reviw: products.reviews,
    });

   

在您的模式中,将
toJson:{virtuals:true}
-ie do
toJson:{virtuals:true}
中的json部分大写,它没有产生任何影响,下面的注释已经解决了我的问题。无论如何,感谢您在我测试它时,它工作得很好。。。但这没关系,因为你似乎已经解决了这个问题。谢谢,它真的解决了。另外,我忘了从产品模型中删除一个:true,因为这只会显示一个评论。