【问题标题】:Some properties missing in req.body inside multer middlewaremulter 中间件中的 req.body 中缺少一些属性
【发布时间】:2020-11-17 01:48:01
【问题描述】:

我有一个客户端应用程序将一些formData 发布到我的节点后端。来自客户端的数据最初是一个包含files 属性的对象。在发布到后端之前,我将对象转换为formData

// client.js file
const person = {
  email: 'johndoe@gmail.com',
  age: 19,
  files: [File, File, File],
  occupation: '',
  status: 'active',
}

person.occupation = this.getOccupation(); // getOccupation() is defined somewhere in the file

const formData = new FormData();
Object.entries(person).forEach(([key, value]) => {
  if (key === "files") {
    for (let i = 0; i < person[key].length; i++) {
       formData.append("files", person[key][i]);
    }
  } else {
     formData.append(key, value);
  }
});

// The following logs output the correct information so we're good until this point
console.log(formData.getAll("files"));
console.log(formData.get("occupation"));
console.log(formData.get("status"));

this.submitData(formData); // Posts to the backend

使用 multer 中间件 - uploadFiles() 将数据发布到节点后端中的路由。

const submitDataOptions = {
  storage: multer.diskStorage({
    destination: "./public/uploads/users/files",
    filename: function (req, file, cb) {
      console.log('Request body');
      console.log(req.body);
      console.log('Occupation');
      console.log(req.body.occupation);
      console.log('Status');
      console.log(req.body.status);
      const ext = file.mimetype.split("/")[1];
      const datetimestamp = Date.now();
      const fname = `${datetimestamp}.${ext}`;
      cb(null, fname);
    },
  }),
};

uploadFiles() {
  return multer(submitDataOptions).array("files");
}

文件上传得很好,但是当我console.log(req.body) 时,我注意到返回了一个只有属性emailage 的对象。在任何一种情况下,记录 occupationstatus 都会返回 undefined。 multer 文档说req.body 将包含文本字段(如果有的话),但在这种情况下我找不到那些。

这里有什么问题?

【问题讨论】:

  • 不要签入req.body,签入req。您应该获取上传文件的 req.files 和 req.occupation,req.status 应该包含您上传的数据。那是因为你发送了一个带有 formData 的请求,所以 req.body 不会被填充。
  • req.status 和 req.occupation 都未定义。

标签: node.js multer


【解决方案1】:

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

所以只需将文件放在对象的最后:

const person = {
  email: 'johndoe@gmail.com',
  age: 19,
  occupation: '',
  status: 'active',
  files: [File, File, File],
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2020-03-25
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多