我正在使用nodejs创建一个端点,该端点将使用multer存储图像数组。它允许我保存单个图像,但不知道如何处理多个图像。对于上传单个图像,这是我编写的代码:
router.post ('/upload',auth, upload.single('upload'), async (req:Request, res:Response) =>{
const bufferData = {
image:req.file.buffer
};
const image = new Image(bufferData);
image.save();
res.send()
},(error:Error, req:Request, res:Response, next:NextFunction)=>{
res.status(400).send({error:error.message})
})
对于单个文件上传,此功能正常。 对于多个文件上传,我正在尝试使用此代码。
router.post ('/upload',auth, upload.array('upload'), async (req:Request, res:Response) =>{
const bufferData = {
images:req.files // no here option for req.files.buffer
};
const image = new Image(bufferData);
image.save();
res.send()
},(error:Error, req:Request, res:Response, next:NextFunction)=>{
res.status(400).send({error:error.message})
})
用于存储图像的数据类型必须为Buffer。但是没有任何选择来获取缓冲区格式的图像数组,例如req.file.buffer。 用数组格式处理这些数据的方法是什么?
答案 0 :(得分:0)
找到了一个窍门。
const files = req.files;
const images = map(files, (file:any)=>{
const bufferData = (file as Express.Multer.File).buffer;
return bufferData;
})
此“图像”现在是Buffer类型的数组,您可以将其作为二进制文件存储到mongoDB数据库中。
答案 1 :(得分:0)
没有看到完整的代码,我假设您的Image
类是扩展mongoose的类,它具有某种保存方法?
在这种情况下,您的save()
方法可能是异步的。这意味着,您需要等待方法解析后才能继续/返回。
router.post ('/upload',auth, upload.array('upload'), async (req:Request, res:Response) => {
const promises = req.files.map(file => {
const image = new Image(file.buffer) // create the new Image
return image.save // return the promise without calling it yet
})
const images = await Promise.all(promises) // calls all the porimises returned in `promises`
// we let the Promise.all resolve before calling res.send()
res.send(images)
},(error:Error, req:Request, res:Response, next:NextFunction)=>{
res.status(400).send({error:error.message})
})
正如您在此处看到的,我们创建了一个称为promises
的诺言数组。
然后我们用Promise.all(promises)
调用所有这些,一旦解决所有问题,便可以使用res.send
方法返回
我还没有测试过这段代码,因此我不得不对其余代码库的外观进行一些猜测,希望如此行之有效。