如何让Multer正确地解析与表单数据一起发送的客户端请求? [英] How can I make multer parse a client request sent with form-data properly?
本文介绍了如何让Multer正确地解析与表单数据一起发送的客户端请求?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Node.js
。在客户端上,我使用库axios
和form-data
。在我使用的服务器上,express
和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
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-type
Header设置为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屋!
查看全文