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

2024-04-18

我想将数据从客户端传输到双方都使用的服务器计算机Node.js。在客户端我正在使用库axios and form-data。在我正在使用的服务器上express and multer...

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

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

这段代码是有效的,我设法得到了form JSON我在客户端上创建的作为服务器上的请求消息。然而,我的输出req.body服务器上的内容如下:

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

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


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


你所看到的原因是multer 仅在以下情况下解析请求content-type标头设置为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);
  });

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 multer 正确解析使用表单数据发送的客户端请求? 的相关文章

随机推荐