将对象转换为FormData时,字段会沿途丢失

时间:2020-10-19 14:34:52

标签: javascript reactjs file-upload multipartform-data form-data

在图像上传期间,我想向请求的正文中添加一个附加字段,以便后端知道是否允许gif文件类型。但是,作为POST请求的正文发送的params对象需要转换为Formdata才能上载图像。问题是,当请求命中API时,req.body中只有我的一个文本字段。转换后,我正在尝试检查FormData,但它在控制台中仅显示为FormData {}。它在其他地方说,您可以使用FormData.values()方法检查FormData中的值,但这仅在控制台中显示为Iterator。因此,我不知道问题出在从对象到formData的转换点(我怀疑)还是在到达API之前。

注意:我正在使用object-to-formdata软件包。

我的表单生成的对象看起来像这样:

{
  name: "name",
  cookingInstructions: [{ step: 1, text: "blah blah" },],
  image: File,
  imageUrl: 'http://a.url.com',
  yield: 1,
 }

我想添加一个字段以指示是否允许使用gif,所以我的帮助函数如下所示:

export function addRecipe(params) {
  if (params.image && !params.imageUrl) {
    const modifiedParams = params;
    modifiedParams.query = { gif: false };
    modifiedParams.gif = false;
    const paramsImage = serialize(modifiedParams);
    return apiCall('post', '/users/upload', paramsImage).then(result => {
      params.imageUrl = result.file;
      return apiCall('post', `/recipe`, params);
    });
  }
  return apiCall('post', `/recipe`, params);
}

这是后端的图片上传中间件:

const fileFilter = (req, file, cb) => {
  console.log(req.query); // {}
  console.log(req.body); // [Object: null prototype] { yield: '1' }
  console.log(req.body.gif); // undefined
  if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/gif') {
    cb(null, true);
  } else {
    cb(new Error('Invalid file type, only JPEG, PNG, and GIF are allowed!'), false);
  }
};

正如您在上面的评论中看到的那样,唯一通过的字段似乎是yield,但是不清楚原因。我们在这里转换为FormData的方式有问题吗? const upload = multer({ fileFilter, 储存:multerS3({ acl:“公开阅读”, s3, 值区:process.env.AWS_BUCKET || “营养学”, 密钥(要求,文件,cb){ cb(null,Date.now()。toString()); }, }), });

0 个答案:

没有答案