如何使用multer将文件数组保存到mongoDB数据库?

时间:2019-05-11 18:22:31

标签: node.js mongodb express mongoose multer

我正在使用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。 用数组格式处理这些数据的方法是什么?

2 个答案:

答案 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方法返回

我还没有测试过这段代码,因此我不得不对其余代码库的外观进行一些猜测,希望如此行之有效。