node.js - 如何使 multer 正确解析使用表单数据发送的客户端请求?

标签 node.js express axios multer form-data

我想将数据从客户端传输到服务器计算机,两者都使用 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')
})

这段代码是有效的,我设法获取我在客户端上创建的表单 JSON作为服务器上的请求消息。但是,我的 req.body 在服务器上的输出如下:

{ '----------------------------926328179431047129531240\r\nContent-Disposition: form-data; name':
   '"user"\r\n\r\nsomeuser\r\n----------------------------926328179431047129531240--\r\n' }

此输出未按我的预期格式化为 JSON 对象。来自 multer 的参数 upload.none() 不应该将 req.body 解析为 JSON 吗? 有谁知道我在这里出了什么问题,以及是否需要更改任何其他参数才能使 req.body 上的输出格式化为 JSON 对象?


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

最佳答案

您所看到的原因是 multer 仅在 content-type header 设置为 multipart/form-data< 时才解析请求。您没有设置请求 header ,因此使用 application/x-www-form-urlencoded 发送请求,multer 会忽略它,body-parser改为进行解析。

要解决此问题,请在您的请求中设置 header ,如下所示:

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);
  });

关于node.js - 如何使 multer 正确解析使用表单数据发送的客户端请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59014876/

相关文章:

javascript - 如何将 Replacer 函数与 JSON Stringify 结合使用?

javascript - 如何从本地文件夹(磁盘存储)读取或获取图像文件并使用nodejs服务器将其发送到Angularjs?

javascript - 当我尝试显示对象的值时,为什么会得到 "undefined"?

node.js - Node + Express .post 路由抛出错误。预期回调,得到对象

node.js - 尽管使用 CORS,对 expressjs 的 POST 请求仍无法正常工作

reactjs - React 不断捕获网络错误!尝试从本地主机 :8080 获取数据时

node.js - 如何正确使用函数 populate()

node.js - 在NodeJS中制作点击事件

node.js - 进行异步调用的 Express 中间件

javascript - 使用 Reactjs 的 Axios Post 表单