如何将文件名从multer传递到另一个中间件?

时间:2018-01-12 13:38:24

标签: javascript node.js express multer

Multer获取我上传的文件并将其放入文件对象中,以便我们可以通过文件访问它,但req.body.image为空,我希望能够将file.originalname传递给req.body.image作为存储磁盘位置的路径。现在,我正在使用多个文件,所以我想将它们的路径存储在req对象中,并在另一个中间件中访问它。 我试过这样的事情

req.body.image.push(`path/${file.originalname}`)

返回错误

  

TypeError:无法读取未定义

的属性'push'

1 个答案:

答案 0 :(得分:0)

  

TypeError:无法读取属性' push'未定义的

当您使用req.body.image时,undefined似乎不是数组而是push()

对请求对象进行multer adds a single file时,会将它们添加到req.file属性中。然后,您可以在后续中间件中访问req.file,如下例所示。如果您有multiple uploaded files,那么您将访问文件数组req.files并遍历该集合以访问每个文件对象。

在上面的代码中,您要修改req.body对象并添加属性image,我建议您不要更改req.body对象。最好不要改变请求标题或正文之类的内容。相反,您可以向请求对象添加新属性req.image

以下示例使用路由器中间件来封装上传逻辑(通常应将其保存到单个路由),然后将该中间件添加到Express Server。

imageUploadRouter.js

// imageUploadRouter.js
const router = require('express').Router()
const multer = require('multer')
const upload = multer({dest: 'uploads/'})

router.use(upload.single('image'))
router.use((req, res, next) => {
  if (!Array.isArray(req.image)) {
    req.image = []
  } 

  if (req.file) {
    req.image.push(`path/${req.file.originalName}`)
  }

  return next()
})

// add some additional routes for logic
router.post('/', (req, res) => {
  // do something and respond
  // you can access req.image here too
  return res.sendStatus(201)
})

module.exports = router

server.js

// server.js
const express = require('express')
const ImageUploadRouter = require('./imageUploadRouter')

const server = new Express()
const port = process.env.PORT || 1337

server.use('/images', ImageUploadRouter)
server.listen(port, () => console.log(`Lisening on ${port}`))