为什么我不能通过multer访问req.body?

时间:2019-09-11 21:18:42

标签: node.js express vue.js multer

我的应用程序(使用vue)允许用户将包含有关数据的一些信息的文件上传到我的节点后端。当用户提交表单时,将触发此功能:

methods: {
      buttonOK () {
        const formData = new FormData()

        formData.append('name', this.detailFirm.name)
        formData.append('description', this.detailFirm.description)
        formData.append('version', this.detailFirm.version)
        formData.append('date', this.detailFirm.date)
        formData.append('file', this.file)

        for (var [key, value] of formData.entries()) {
          console.log(key, value)
        }

        let headers = {
          'Content-Type': 'multipart/form-data',
          'Accept': 'multipart/form-data'
        }

        this.$http.put('/firmware', formData, {headers: headers})
        this.visible = false
      }

log语句显示了它应该执行的所有操作,并在发出请求时,chrome开发工具中的network标签显示了正在执行的发布数据,并具有应具有的所有值:

name: test
description: test
version: 1
date: 0555-05-05
file: (binary)

我的multer中间件如下:

const multer = require('multer')
const mult = multer({
  dest: '/firmware'
})

module.exports = function (req, res, next) {
  /* --Convert multipart/form-data to useable format within express-- */
  if (req.path === '/firmware') {
    mult.single('file')
    console.log('MULTER MIDDLEWARE')
  }
  next()
}

那里的日志语句有效,使我相信multer在起作用。
我似乎无法在后端访问此信息。在这里,我尝试使用fileformData作为mult.single('')中的文件名。

这是我的控制器功能:

let firmware = {
    name: req.body.name,
    version: req.body.version,
    description: req.body.description,
    date: req.body.date,
    file: req.body.file
  }
  firmwareRepo.create(firmware, (err, create) => {
                   .............

我已经阅读了其他一些问题,并进行了一些调整,但是当我在控制器中登录req.body时,总是得到一个空对象。请告知。

3 个答案:

答案 0 :(得分:1)

编辑:

首先,我记得我在前端(React)上遇到了一个问题,即添加了不需要的标头(以某种方式通过将formdata标头添加到所有东西),这是示例:

data append stuff goes here 

const data = new FormData()

data.append('id', values.id)

......

return async (dispatch) => {
                const respond = await fetch('/api/postdata', {
                method: 'post',
                headers: {
                   //SEE? THIS IS EMPTY
                },
                body: data
            })

            // send form to backend
            dispatch(dataSend())
        }
    }

第二个问题可能在后端。事实是,您不能仅仅通过req.body访问文件信息。您需要通过req.file

访问它
  .post('/api/post', (req, res, next)=> {
    const photo = {}
    const newData = {}

    uploadData(req, res, (err) => {
      if(err){
        console.log('error')
      }
      else {
        Object.assign(photo, {file: req.file})
        Object.assign(newData, {newData: req.body})

然后将照片传递到您要对其进行处理的地方

    const addDataController = new AddDataController(req, res, next, newAdvertData, photo)
    addAdvertController.postAdvert()
  }
})

基本上,我所做的是我将常规数据与文件分离,然后将其进一步传递以合并并得出表格。抱歉,如果这样做没有帮助,那么您还是很亲密!

答案 1 :(得分:0)

https://github.com/expressjs/multer#diskstorage

请注意,req.body可能尚未完全填充。这取决于客户端将字段和文件传输到服务器的顺序。

答案 2 :(得分:0)

我不知道为什么会这样,但是当我停止将multer用作导入的中间件时,一切都会开始正常运行,就像这样:

module.exports = function (req, res, next) {
  /* --Convert multipart/form-data to useable format within express-- */
  if (req.path === '/firmware') {
    mult.single('formData')
    console.log('MULTER MIDDLEWARE')
  }
  next()
}

而是直接将其应用于路由功能,如下所示:

router.put('/firmware', upload.single('formData'), firmware.create) // doesn't work as standalone middleware

如果有人知道为什么会这样,请告诉我。