Node.js发送带Form-data的POST请求无数据返回问题求助
Node.js发送Form-data POST请求数据未被接收的问题
我使用Node.js的https.request模块和form-data库构造携带Form-data的POST请求,测试地址为postman-echo.com/post。请求返回状态码200,但响应中仅包含预设的请求头,Form-data数据未被正确接收——响应的form字段为空,content-length显示为0。
错误代码
import { request } from 'https'; import FormData from 'form-data'; const formData = new FormData(); formData.append('type', '1'); formData.append('subject', 'Example subject'); formData.append('description', 'Example description'); formData.append('location', 'Example location'); console.log("🚀 ~ file: postman-post.mjs:9 ~ formData:", formData) var boundary = formData._boundary; console.log("🚀 ~ file: postman-post.mjs:11 ~ boundary:", boundary); const options = { hostname: 'postman-echo.com', port: 443, path: '/post', method: 'POST', headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'Cookie': 'myCookie=myCookiee', 'Content-Type': `multipart/form-data; boundary=${boundary}` }, body: formData }; const req = request(options, (res) => { console.log(`Status code: ${res.statusCode}`); res.on('data', (chunk) => { console.log(`Response body: ${chunk}`); }); }); req.on('error', (error) => { console.error(error); }); req.end();
控制台日志
🚀 ~ file: postman-post.mjs:9 ~ formData: FormData { _overheadLength: 426, _valueLength: 51, _valuesToMeasure: [], writable: false, readable: true, dataSize: 0, maxDataSize: 2097152, pauseStreams: true, _released: false, _streams: [ '----------------------------511827528311442099887851\r\n' + 'Content-Disposition: form-data; name="type"\r\n' + '\r\n', '1', [Function: bound ], '----------------------------511827528311442099887851\r\n' + 'Content-Disposition: form-data; name="subject"\r\n' + '\r\n', 'Example subject', [Function: bound ], '----------------------------511827528311442099887851\r\n' + 'Content-Disposition: form-data; name="description"\r\n' + '\r\n', 'Example description', [Function: bound ], '----------------------------511827528311442099887851\r\n' + 'Content-Disposition: form-data; name="location"\r\n' + '\r\n', 'Example location', [Function: bound ] ], _currentStream: null, _insideLoop: false, _pendingNext: false, _boundary: '--------------------------511827528311442099887851' } 🚀 ~ file: postman-post.mjs:11 ~ boundary: --------------------------511827528311442099887851 Status code: 200 Response body: { "args": {}, "data": {}, "files": {}, "form": {}, "headers": { "x-forwarded-proto": "https", "x-forwarded-port": "443", "host": "postman-echo.com", "x-amzn-trace-id": "Root=1-64270c8e-1e3b458b7da07d124d6829ce", "content-length": "0", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36", "cookie": "myCookie=myCookiee", "content-type": "multipart/form-data; boundary=--------------------------511827528311442099887851" }, "json": null, "url": "https://postman-echo.com/post" Response body: }
解决方案
问题根源有两个:
- Node.js的
https.request不支持在options中直接设置body字段,需手动将FormData的可读流写入请求对象。 - 手动拼接
Content-Type头容易出错,应使用FormData自带的getHeaders()方法获取正确的请求头(包含自动生成的boundary)。
修正后的代码:
import { request } from 'https'; import FormData from 'form-data'; const formData = new FormData(); formData.append('type', '1'); formData.append('subject', 'Example subject'); formData.append('description', 'Example description'); formData.append('location', 'Example location'); const options = { hostname: 'postman-echo.com', port: 443, path: '/post', method: 'POST', headers: { ...formData.getHeaders(), // 合并FormData的请求头,包含正确的Content-Type和boundary 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'Cookie': 'myCookie=myCookiee' } }; const req = request(options, (res) => { console.log(`状态码: ${res.statusCode}`); let responseBody = ''; // 拼接完整响应体后再解析输出 res.on('data', (chunk) => { responseBody += chunk; }); res.on('end', () => { console.log('响应体:', JSON.parse(responseBody)); }); }); req.on('error', (error) => { console.error(error); }); // 将FormData流管道到请求对象,自动处理数据写入 formData.pipe(req);
关键修正点
- 移除手动设置的
Content-Type,改用formData.getHeaders()确保boundary和请求头格式正确 - 取消
options.body,通过formData.pipe(req)将FormData的可读流写入请求 - 优化响应处理逻辑,拼接所有chunk后再解析为JSON,避免分段输出
内容的提问来源于stack exchange,提问作者Steve H
相关产品推荐
相关产品推荐

