показ изображения из нескольких изображений товара с использованием nodejs - PullRequest
0 голосов
/ 15 января 2020

Я новичок в 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);

при изображение. 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

Ответы [ 2 ]

3 голосов
/ 15 января 2020

Вы можете достичь этого гораздо более чистым способом, нежели адский колбэк. Попробуйте следующий контроллер:

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);
  }
};

Надеюсь, это сработает для вас.

1 голос
/ 15 января 2020

Просто используйте агрегирование, чтобы оно могло быть выполнено только в одном запросе. Это сэкономит вам время одного запроса.

import { Types } from 'mongoose';

let products = await Product.aggregate([
{
    $match:
        {
            userRef: Types.ObjectId.createFromHexString(id),
        },
},
{
        $lookup:
        {
            from: 'images',
            localField: '_id',
            foreignField: 'productId',
            as: 'images',
        },
},
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...