Tridib Chatterjee Ответов: 1

Получить расположение нескольких изображений в базе данных mongodb


Я пытаюсь загрузить несколько файлов из моего приложения NodeJs в базу данных MongoDB с помощью Multer. Но проблема в том, что когда я сохраняю местоположение файла в своей базе данных, сохраняется только одно местоположение файла, а другие игнорируются. Это происходит потому, что в моей функции я сохраняю только 1-й элемент массива, используя req.files[0].location. Мне нужен обходной путь, чтобы создать цикл и сохранить все расположения файлов вместо жесткого кодирования позиции элемента массива в req.files. Мне нужно сохранить файлы как
"imagePath": [
    {
      "small": "https://mean-ecom.s3.ap-south-1.amazonaws.com/1592947173797",
      "big": "https://mean-ecom.s3.ap-south-1.amazonaws.com/1592947173797"
  },
  {
      "small": "https://mean-ecom.s3.ap-south-1.amazonaws.com/1592947173799",
      "big": "https://mean-ecom.s3.ap-south-1.amazonaws.com/1592947173799"
  },
  {
      "small": "https://mean-ecom.s3.ap-south-1.amazonaws.com/1592947173711",
      "big": "https://mean-ecom.s3.ap-south-1.amazonaws.com/1592947173711"
  }


Ниже приведена моя функция. Мне нужна помощь с моделью и сохранением нескольких местоположений imagePath указанным выше способом. Любая помощь будет оценена по достоинству!

Что я уже пробовал:

route.js
const ProductController = require('./../controllers/productController');
const appConfig = require("./../config/appConfig");
const multer = require('multer');
const aws = require('aws-sdk');
const multerS3 = require('multer-s3');
const path = require('path');
const s3 = new aws.S3({ accessKeyId: "***", secretAccessKey: "***" });
 var upload = multer({
    storage: multerS3({
      s3: s3,
      bucket: 'mean-ecom',
      metadata: function (req, file, cb) {
        cb(null, {fieldName: file.originalname + path.extname(file.fieldname)});
      },
      key: function (req, file, cb) {
        cb(null, Date.now().toString())}})});
let setRouter = (app) => {
    let baseUrl = appConfig.apiVersion;
app.post(baseUrl+'/post-product', upload.any('imagePath'), ProductController.postProduct)}
   module.exports = {
     setRouter: setRouter}

Productcontroller в.postProduct:
const ProductModel = mongoose.model('Product')

let postProduct = (req, res) => {
    let newProduct = new ProductModel({

                imagePath: req.file[0].location})
            newProduct.save((err, result) => {
                if (err) { console.log('Error at saving new Product :: ProductController', err);
                 res.send(err);
            } else { 
                console.log('Successfully saved new Product'); res.send(result) }
            })}

productModel.js:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
let productSchema = new Schema(
    {
       imagePath: {
                type: String,
                default: ''    }})
mongoose.model('Product', productSchema);

Richard MacCutchan

Я не вижу строки кода, которая ссылается на req.files[0].location Но все, что вам нужно, это что-то вроде:

for (int i = 0; i < number_of_files; ++i)
{
    copy(req.files[i].location, destination[i]) // or whatever required code
}

1 Ответов

Рейтинг:
10

Tridib Chatterjee

// We loop throw the req.files array and store their locations in the temporal files array
    for (let i = 0; i < req.files.length; i++) {
        let file = req.files[i].location
        files.push(file)
      }

          let newProduct = new ProductModel({
                              imagePath: files
                                   })