You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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: }

解决方案

问题根源有两个:

  1. Node.js的https.request不支持在options中直接设置body字段,需手动将FormData的可读流写入请求对象。
  2. 手动拼接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:08:11