使用 NodeJS 显示来自产品的多个图像的图像



我是Node的新手.js正在从事一个电子商务项目,我有两种不同的产品和图像模型。

产品.js型号

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const productSchema = new Schema({
title: {
type: String,
required: true
},
price: {
type: Number,
required: true
},
description: {
type: String,
required: true
},
userId: {
type: Schema.Types.ObjectId,
ref: 'User',
required: true
}
});
module.exports = mongoose.model('Product', productSchema);

图片.js型号

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const imageSchema = new Schema({
imageUrl: {
type: String,
required: true
},
productId: {
type: Schema.Types.ObjectId,
ref: 'Product',
required: true
}
});

module.exports = mongoose.model('Image', imageSchema);

Image.js模型中,单个产品有多个图像 保存图像和产品后,我想在多个图像中显示产品的单个图像。 这是我的控制器

exports.getProducts = (req, res, next) => {
let imagesArr = [];
Product.find({ userId: req.user._id })
.then(products => {
for (product of products){
Image.find({productId: product._id})
.then(images => {
imagesArr.push(images[0]);
})
.catch(err => {
console.log(err);
});
}
console.log("Choosed Images", imagesArr);    
})
.then(result => {
return res.render('admin/products', {
pageTitle: 'Admin Product',
path: '/admin/products',
editing: editMode,
product: product,
images:imagesArr,
hasError: false,
errorMessage: null,
validationErrors: []
});
})
.catch(err => {
const error = new Error(err);
error.httpStatusCode = 500;
return next(error);
});
};

不幸的是,imageArr变得空。我知道因为异步变得空。 请建议我如何实现这一点。我是 Nodejs 的新手

你可以用更干净的方式实现这一点,而不是回调地狱。尝试以下控制器:

exports.getProducts = async (req, res, next) => {
try{
let imagesArr = [];
let products = await Product.find({ userId: req.user._id });
for (product of products){
let images = await Image.find({productId: product._id})
if(images && images.length >0) imagesArr.push(images[0]);
}

console.log("Choosed Images", imagesArr); 
return res.render('admin/products', {
pageTitle: 'Admin Product',
path: '/admin/products',
editing: editMode,
product: product,
images: imagesArr,
hasError: false,
errorMessage: null,
validationErrors: []
});
}catch(err){
const error = new Error(err);
error.httpStatusCode = 500;
return next(error);
}
};

希望这对你有用。

只需使用聚合,以便只能在一个查询中完成。 这将为您节省一次查询的时间。

import { Types } from 'mongoose';
let products = await Product.aggregate([
{
$match:
{
userRef: Types.ObjectId.createFromHexString(id),
},
},
{
$lookup:
{
from: 'images',
localField: '_id',
foreignField: 'productId',
as: 'images',
},
},
]);

最新更新