如何将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
相关产品推荐
相关产品推荐

