创建一个发送带有多部分表单数据的响应的Nodejs服务器

时间:2018-06-15 18:26:01

标签: node.js multipartform-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.我们如何使表单数据响应内容显示在响应正文中而不是作为下载文件?

2 个答案:

答案 0 :(得分:2)

要发送您的表单数据,您需要管理它(请参阅documentation),如下所示:

form.pipe(res);

要将边界添加到标题中,您可以执行以下操作:

res.setHeader('Content-Type', 'multipart/form-data; boundary='+form.getBoundary());

现在,关于"另存为"框:浏览器使用内容类型来确定如何处理文件。因此,如果您希望它显示在浏览器窗口中,那么一个不错的选择是text/plain(如果不起作用,可能是text/html。然后,您可以将multipart/form-data放入x-content-type

之类的内容中

(我假设您最终会使用XHR或fetch,此时您可以切换content-typetext/plain这只是一个临时解决方案获取数据以显示在标准Web浏览器中进行测试。)

全部放在一起:

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

答案 1 :(得分:-1)

在我的情况下,是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);