使用Multer和Cloudinary在node.js/Mongodb中上载多个图像时出现问题
我在尝试将多个图像上载到我的页面时遇到问题。我正在使用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配置正确,我可以通过其他路径上传单个图像 提前谢谢使用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),它将返回名称和价格(表单中的数据),但不会返回任
// 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)
})
})
}
})
}
)