Multer获取我上传的文件并将其放入文件对象中,以便我们可以通过文件访问它,但req.body.image
为空,我希望能够将file.originalname
传递给req.body.image
作为存储磁盘位置的路径。现在,我正在使用多个文件,所以我想将它们的路径存储在req对象中,并在另一个中间件中访问它。
我试过这样的事情
req.body.image.push(`path/${file.originalname}`)
返回错误
TypeError:无法读取未定义
的属性'push'
答案 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
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
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}`))