创建一个使用多部分表单数据发送响应的 Nodejs 服务器
Creating a Nodejs server that send response with multipart form data
有很多关于如何使用多部分表单数据处理请求的帖子。但我的用例是我有一个客户端需要来自服务器的多部分表单数据响应,我需要编写一个简单的 nodejs 服务器来测试我的客户端。
为了编写简单的服务器,我有以下内容:
var express = require('express');
var bodyParser = require('body-parser');
var FormData = require('form-data');
var app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.get('/describe', function(req, res) {
var form = new FormData();
form.append('part1', 'part 1 data');
form.append('part2', 'part 2 data');
res.setHeader('Content-Type', 'multipart/form-data');
res.send(form);
});
app.listen(3030, "0.0.0.0");
console.log('Listening on port 3030...');
现在当我的客户端请求 localhost:3030/describe 时,响应头显示如下没有边界值
Content-Type: multipart/form-data; charset=utf-8
并且内容作为文件而不是在响应正文中下载。
{"_overheadLength":208,"_valueLength":22,"_valuesToMeasure":[],"writable":false,"readable":true,"dataSize":0,"maxDataSize":2097152,"pauseStreams":true,"_released":false,"_streams":["----------------------------315683163006570790405079\r\nContent-Disposition: form-data; name=\"part1\"\r\n\r\n","part 1 data",null,"----------------------------315683163006570790405079\r\nContent-Disposition: form-data; name=\"part2\"\r\n\r\n","part 2 data",null],"_currentStream":null,"_boundary":"--------------------------315683163006570790405079"}
所以我的问题是:
1.我们如何让边界出现在响应头中?
2. 如何让表单数据响应内容显示在响应正文中而不是下载文件?
要发送您的表单数据,您需要将其通过管道传输(参见 documentation),如下所示:
form.pipe(res);
要将边界添加到 header,您可以这样做:
res.setHeader('Content-Type', 'multipart/form-data; boundary='+form.getBoundary());
现在,关于 "save as" 框:浏览器使用 content-type 来决定如何处理文件。因此,如果您希望它显示在浏览器中 window,一个不错的选择是 text/plain
(或者可能是 text/html
,如果这不起作用)。然后你可以把你的 multipart/form-data
变成像 x-content-type
.
这样的东西
(我假设您最终会使用 XHR 或 fetch,到那时您可以将 content-type
切换回来。text/plain
只是一个临时解决方案数据显示在标准网络浏览器中进行测试。)
综合起来:
app.get('/describe', function(req, res) {
var form = new FormData();
form.append('part1', 'part 1 data');
form.append('part2', 'part 2 data');
res.setHeader('x-Content-Type', 'multipart/form-data; boundary='+form._boundary);
res.setHeader('Content-Type', 'text/plain');
form.pipe(res);
});
在我的例子中,Webhook 调用的是 POST 请求,我使用 multer
也发挥了作用。这是代码。
const express = require('express');
const bodyParser = require('body-parser');
var multer = require('multer');
var upload = multer();
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.post('/', upload.none(), function (req, res) {
console.log("Data",req.body)
res.status(200).send('OK');
});
app.listen(port);
有很多关于如何使用多部分表单数据处理请求的帖子。但我的用例是我有一个客户端需要来自服务器的多部分表单数据响应,我需要编写一个简单的 nodejs 服务器来测试我的客户端。
为了编写简单的服务器,我有以下内容:
var express = require('express');
var bodyParser = require('body-parser');
var FormData = require('form-data');
var app = express();
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
app.get('/describe', function(req, res) {
var form = new FormData();
form.append('part1', 'part 1 data');
form.append('part2', 'part 2 data');
res.setHeader('Content-Type', 'multipart/form-data');
res.send(form);
});
app.listen(3030, "0.0.0.0");
console.log('Listening on port 3030...');
现在当我的客户端请求 localhost:3030/describe 时,响应头显示如下没有边界值
Content-Type: multipart/form-data; charset=utf-8
并且内容作为文件而不是在响应正文中下载。
{"_overheadLength":208,"_valueLength":22,"_valuesToMeasure":[],"writable":false,"readable":true,"dataSize":0,"maxDataSize":2097152,"pauseStreams":true,"_released":false,"_streams":["----------------------------315683163006570790405079\r\nContent-Disposition: form-data; name=\"part1\"\r\n\r\n","part 1 data",null,"----------------------------315683163006570790405079\r\nContent-Disposition: form-data; name=\"part2\"\r\n\r\n","part 2 data",null],"_currentStream":null,"_boundary":"--------------------------315683163006570790405079"}
所以我的问题是: 1.我们如何让边界出现在响应头中? 2. 如何让表单数据响应内容显示在响应正文中而不是下载文件?
要发送您的表单数据,您需要将其通过管道传输(参见 documentation),如下所示:
form.pipe(res);
要将边界添加到 header,您可以这样做:
res.setHeader('Content-Type', 'multipart/form-data; boundary='+form.getBoundary());
现在,关于 "save as" 框:浏览器使用 content-type 来决定如何处理文件。因此,如果您希望它显示在浏览器中 window,一个不错的选择是 text/plain
(或者可能是 text/html
,如果这不起作用)。然后你可以把你的 multipart/form-data
变成像 x-content-type
.
(我假设您最终会使用 XHR 或 fetch,到那时您可以将 content-type
切换回来。text/plain
只是一个临时解决方案数据显示在标准网络浏览器中进行测试。)
综合起来:
app.get('/describe', function(req, res) {
var form = new FormData();
form.append('part1', 'part 1 data');
form.append('part2', 'part 2 data');
res.setHeader('x-Content-Type', 'multipart/form-data; boundary='+form._boundary);
res.setHeader('Content-Type', 'text/plain');
form.pipe(res);
});
在我的例子中,Webhook 调用的是 POST 请求,我使用 multer
也发挥了作用。这是代码。
const express = require('express');
const bodyParser = require('body-parser');
var multer = require('multer');
var upload = multer();
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.post('/', upload.none(), function (req, res) {
console.log("Data",req.body)
res.status(200).send('OK');
});
app.listen(port);