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

如何将NodeJS环境下的form-data对象转换为可读JSON字符串

Node.js form-data 实例序列化日志方案

实现原理

Node.js 环境的form-data第三方包没有内置的表单内容序列化方法,可通过读取其内部存储的表单字段,手动构建可转为JSON的普通对象。

代码实现

工具函数

const FormData = require('form-data');

/**
 * 将form-data包的实例转为可日志输出的JSON字符串
 * @param {FormData} formInstance form-data实例
 * @returns {string} 序列化后的表单JSON
 */
function formDataToLogJson(formInstance) {
  const formObj = {};
  // 读取form-data内部存储的所有表单项
  const formParts = formInstance._getParts();

  formParts.forEach(part => {
    const { name, value, options } = part;
    // 区分普通文本字段和文件字段
    if (options?.filename) {
      // 文件字段仅记录元信息,避免日志过大
      formObj[name] = {
        fieldType: 'file',
        fileName: options.filename,
        contentType: options.contentType || 'application/octet-stream'
      };
    } else {
      formObj[name] = value;
    }
  });

  return JSON.stringify(formObj, null, 2);
}

Axios拦截器中使用示例

const fs = require('fs');
const axios = require('axios');

const axiosIns = axios.create();

axiosIns.interceptors.request.use(config => {
  // 判断当前请求数据是form-data实例时做日志序列化
  if (config.data instanceof FormData) {
    const formLogStr = formDataToLogJson(config.data);
    // 写入日志文件,可根据自己的日志组件调整逻辑
    const logLine = `[${new Date().toISOString()}] 请求地址:${config.url},表单内容:\n${formLogStr}\n`;
    fs.appendFileSync('./request.log', logLine, 'utf-8');
  }
  return config;
}, err => Promise.reject(err));

注意事项

  • 上述实现依赖form-data包内部方法_getParts(),目前form-data所有v4及以下稳定版本均支持该方法,若后续包版本升级有结构调整,可对应修改字段读取逻辑即可
  • 不建议在日志中输出文件二进制内容,会导致日志文件体积过大且不可读,仅保留文件元信息即可满足常规排查需求

内容的提问来源于stack exchange,提问作者Shivam Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:36:03