如何让Multer正确地解析与表单数据一起发送的客户端请求? [英] How can I make multer parse a client request sent with form-data properly?

查看:8
本文介绍了如何让Multer正确地解析与表单数据一起发送的客户端请求?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望将数据从客户端传输到服务器计算机,在该服务器计算机上,它们都在使用Node.js。在客户端上,我使用库axiosform-data。在我使用的服务器上,expressmulter...

我使用的客户端代码如下:

const FormData = require('form-data');
const axios = require('axios');

let form = new FormData();
form.append("user", "someuser");

axios({
    method: 'post',
    url: 'http://localhost:9996/data',
    data: form
})
.then(function (response) {
     console.log(response.status);
})
.catch(function (response) {
     console.log(response.status);
});

服务器代码如下:

const express = require('express')
const bodyParser = require('body-parser');
const multer  = require('multer')

const app = express();
const upload = multer();
app.use(bodyParser.urlencoded({extended: true}));

app.post('/data', upload.none(), function (req, res, next) {
    console.log(req.body);
    res.sendStatus(200)
})

const port = 9996;
app.listen(port, () => {
        console.log(`running on port ${port}`)
})
.on('error', function(err) {
        console.log('stopped')
})
这段代码可以正常工作,我设法获得了我在客户机上创建的formJSON,作为服务器上的请求消息。但是,我的req.body在服务器上的输出如下:

{ '----------------------------926328179431047129531240
Content-Disposition: form-data; name':
   '"user"

someuser
----------------------------926328179431047129531240--
' }

此输出没有像我预期的那样格式化为JSON对象。multer中的参数upload.none()不是应该将req.body解析为JSON吗?有人知道我在这里犯了什么错误吗?为了将req.body上的输出格式化为JSON对象,是否有任何其他参数需要更改?


观察:我知道,如果我使用const form = {"user":"someuser"}手动创建此JSON,我将在服务器上将输出作为req.body上的对象。然而,我使用form-data是因为在我的原始代码中,我计划使用客户端的createReadStream读取一个大文件,并使用服务器上的createWriteStream将其写入,而库form-data是我发现的使axios支持数据流的解决方案。

推荐答案

您看到的原因是multer只在content-typeHeader设置为multipart/form-data时才解析请求。您没有设置请求标头,因此使用application/x-www-form-urlencoded发送请求,multer忽略请求,而body-parser进行解析。

要解决此问题,请按如下方式设置您的请求的标头:

const FormData = require("form-data");
const axios = require("axios");

let form = new FormData();
form.append("user", "someuser");
// form.append("my_buffer", Buffer.alloc(10)); // or actual image

axios({
  method: "post",
  url: "http://localhost:8080/data",
  data: form,
  headers: form.getHeaders()
})
  .then(function(response) {
    console.log(response.status);
  })
  .catch(function(response) {
    console.log(response.status);
  });

这篇关于如何让Multer正确地解析与表单数据一起发送的客户端请求?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆