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

拉斐尔·穆纳尔斯克(Rafael Muynarsk)

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

这段代码是有效的,我设法将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支持数据流传输的解决方案

米哈尔·莱维(MichalLevý)

您看到的原因是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);
  });

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用python请求将图像与表单数据一起发送?

如何将表单数据从客户端发送到服务器

如何在Laravel上针对Buzz HTTP客户端的Post请求添加表单数据?

如何使用JSP将表单数据解析到客户端Java类

如何在服务器端处理模式下将表单数据与jQuery DataTables数据一起发送

如何将请求OAuthlib与授予类型的“客户端凭据”一起使用?

如何使用node.js将表单数据从客户端脚本发送到服务器脚本

使用sttp的多部分表单数据请求-Scala HTTP客户端

如何从前端服务器发送文件到后端服务器(供上传),前端服务器正在接受来自客户端浏览器的发布请求(表单数据->文件输入)?

如何在PHP / HTML中进行客户端表单数据验证

Apollo客户端:@defer可以与客户端解析器一起使用吗?

如何正确地将数据解析到我的改造客户端中以执行发布请求

通过Ajax发布将文件与表单数据一起发送

AngularJS发布数据显示“客户端发送的请求在语法上不正确”

如何接收客户端发送的数据

我想将 Nuxt 与解析 javascript 客户端一起使用

发送Web请求与其他客户端应用程序一起使用,但不适用于C#

我应该与IBM Worklight一起使用哪个客户端数据库?

JSON格式返回的消息客户端与数据一起 - 的Java /春/ REST

Spring MVC表单-Long和String值。客户端发送的请求在语法上不正确

WebRTC客户端是否可以与仅支持通道而不支持数据/发送机制的TURN服务器一起使用?

HttpClient与客户端证书一起重用

如何在Jersey客户端的DELETE请求中发送封装数据?

如何发送GET请求到HTTP客户端以基于参数检索数据?

如何在aiohttp请求处理程序中通过客户端websocket发送数据

如何在Maven中将CXF wsdl客户端生成与通配符一起使用?

如何将Apache Httpclient与Jersey 2.3客户端一起使用

交易如何与ActiveMQ Artemis核心客户端一起使用?

如何与 Telethon 客户端一起运行线程