Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
使用Multer和Cloudinary在node.js/Mongodb中上载多个图像时出现问题_Node.js_Mongodb_Mongoose_Multer_Cloudinary - Fatal编程技术网

使用Multer和Cloudinary在node.js/Mongodb中上载多个图像时出现问题

使用Multer和Cloudinary在node.js/Mongodb中上载多个图像时出现问题,node.js,mongodb,mongoose,multer,cloudinary,Node.js,Mongodb,Mongoose,Multer,Cloudinary,我在尝试将多个图像上载到我的页面时遇到问题。我正在使用Multer和Cloudinary。由于Cloudinary没有一种方法可以进行多次上传,因此我通过forEach传递了图像数组(以前使用Multer提取)。好的,图像已成功上载到mi cloudinary容器。当我尝试将安全url和公共id推送到req.body.product中时,上载函数出现了问题。如果我在upload函数之外调用console.log(req.body.product),它将返回名称和价格(表单中的数据),但不会返回任

我在尝试将多个图像上载到我的页面时遇到问题。我正在使用Multer和Cloudinary。由于Cloudinary没有一种方法可以进行多次上传,因此我通过forEach传递了图像数组(以前使用Multer提取)。好的,图像已成功上载到mi cloudinary容器。当我尝试将安全url和公共id推送到req.body.product中时,上载函数出现了问题。如果我在upload函数之外调用console.log(req.body.product),它将返回名称和价格(表单中的数据),但不会返回任何关于图像数组和ID的信息。但是如果我在de upload函数中输入console.log,它将返回complett对象(名称、价格和两个数组)。Product.create正在获取没有阵列的对象,因此我将图像上载到Cloudinary,但我无法将URL推送到数据库中以在showpage中使用。在我看来,我忽略了一个范围问题,但我不明白。Multer和cloudinary配置正确,我可以通过其他路径上传单个图像

提前谢谢

// CREATE PRODUCT
router.post('/categorias/:categorie', middleware.adminCheck, upload.array('images'), function (req, res) {
    Categorie.findOne({url: req.params.categorie}, function (err, categorie) {
        if (err) {
            console.log(err);
        } else {
            req.body.product.images = [];
            req.body.product.ids    = [];
            req.files.forEach(function (file) {
                cloudinary.uploader.upload(file.path, function (result) {
                    req.body.product.images.push(result.secure_url);
                    req.body.product.ids.push(result.public_id);
                    console.log(req.body.product);
                });
            });
            console.log(req.body.product);
            Product.create(req.body.product, function (err, product) {
                if (err) {
                    console.log(err);
                } else {
                    categorie.products.push(product);
                    categorie.save();
                    res.redirect('/categorias/' + categorie.url);
                }
            });     
        }
    });
});
[----更新------]

我使用promises甚至setTimeout修复了计时问题,但我发现问题仍然存在。至少在这两种情况下,如果我在product.create之前输入console.log(req.body.product),我会得到如下完整对象:

[Object: null prototype] {
  name: '12',
  price: '12',
  images:
   [ 'https://res.cloudinary.com/dm3wxeaiz/image/upload/v1602339704/xjknwth8mscexukjaznv.jpg',
     'https://res.cloudinary.com/dm3wxeaiz/image/upload/v1602339704/pddcxhvxfcc2zjfjjk3c.jpg' ],
  ids: [ 'xjknwth8mscexukjaznv', 'pddcxhvxfcc2zjfjjk3c' ] }
但是如果在product.create中的任意位置使用console.log记录产品,我会得到以下结果:

{ _id: 5f81c37fbf3da50fb6ba3e1c, name: '12', price: 12, __v: 0 }
最终存储在我的数据库中。
这和我在Product.create之前得到的[Object:null-prototype]有关吗?出于某种原因,似乎无法通过Product.create传递整个对象。这可能是body parser的问题吗?

Cloudinary uploader是异步的,当您在uploader范围外打印console.log时,它可能还没有完成执行,但它最终会在uploader内执行并返回结果。下面是一个使用Promise and then()调用实现它的示例:

下面是如何重新排列代码,以便产品可以使用Cloudinary响应数据。create函数:

router.post(
  '/categorias/:categorie',
  middleware.adminCheck,
  upload.array('images'),
  function(req, res) {
    Categorie.findOne({ url: req.params.categorie }, function(err, categorie) {
      if (err) {
        console.log(err)
      } else {
        req.body.product.images = []
        req.body.product.ids = []
        req.files.forEach(function(file) {
          cloudinary.uploader
            .upload(file.path)
            .then(result => {
              req.body.product.images.push(result.secure_url)
              req.body.product.ids.push(result.public_id)
              console.log(req.body.product)
              Product.create(req.body.product, function(err, product) {
                if (err) {
                  console.log(err)
                } else {
                  categorie.products.push(product)
                  categorie.save()
                  res.redirect('/categorias/' + categorie.url)
                }
              })
            })
            .catch(error => {
              console.log(error)
            })
        })
      }
    })
  }
)