【问题标题】:How to save an array of files to mongoDB database using multer?如何使用 multer 将文件数组保存到 mongoDB 数据库?
【发布时间】:2019-09-29 06:42:20
【问题描述】:

我正在使用 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。 Array格式的数据有什么方法?

【问题讨论】:

    标签: node.js mongodb express mongoose multer


    【解决方案1】:

    找到了一个技巧。

    const files = req.files;
    const images = map(files, (file:any)=>{
        const bufferData = (file as Express.Multer.File).buffer;
        return bufferData;
    })
    

    这个“图像”现在是一个 Buffer 类型的数组,您可以将其作为二进制文件存储到 mongoDB 数据库中。

    【讨论】:

      【解决方案2】:

      没有看到你的完整代码,我假设你的 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 数组。

      然后我们用Promise.all(promises) 调用所有这些,一旦它们都解决了,我们就可以用我们的res.send 方法返回

      我还没有测试过这段代码,我不得不猜测一下你的代码库的其余部分是什么样的,所以希望它可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-30
        相关资源
        最近更新 更多