我想将数据从客户端传输到两者都使用的服务器计算机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\r\nContent-Disposition: form-data; name':
'"user"\r\n\r\nsomeuser\r\n----------------------------926328179431047129531240--\r\n' }
此输出未按我预期的那样格式化为JSON对象。参数upload.none()
不是multer
应该解析req.body
为JSON吗?有谁知道我在这里错了,是否还有其他参数需要更改才能使req.body上的输出格式化为JSON对象?
观察:我知道,如果我手动创建此JSON,const form = {"user":"someuser"}
我将把输出作为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);
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句