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

使用Busboy解析multipart form data返回异常格式无法JSON.parse求助

问题根因
  • 核心原因是大部分Serverless/云函数环境收到的event.body默认是base64编码的二进制内容,你直接将未解码的base64字符串传入Busboy解析,得到的文本字段本身携带乱码,因此无法执行JSON.parse。
  • 现有代码还存在两个可导致解析结果异常的逻辑问题:
    • 处理文件流时仅监听data事件,未对多块数据做拼接,大文件场景下会丢失部分内容
    • 写入请求体后未调用busboy.end(),部分场景下会导致解析不完整、finish事件延迟触发
修复代码
function parseMultipartForm(event) {
  return new Promise((resolve) => {
    const fields = {};
    // 优先判断请求体是否为base64编码,做对应解码处理
    const bodyBuffer = event.isBase64Encoded 
      ? Buffer.from(event.body, 'base64') 
      : Buffer.from(event.body);

    const busboy = new Busboy({
      headers: event.headers
    });

    busboy.on("file", (fieldname, filestream, filename, transferEncoding, mimeType) => {
      const fileChunks = [];
      filestream.on("data", (data) => {
        fileChunks.push(data);
      });
      // 流读取完成后拼接完整buffer存入字段
      filestream.on("end", () => {
        fields[fieldname] = {
          filename,
          type: mimeType,
          content: Buffer.concat(fileChunks),
        };
      });
    });

    busboy.on("field", (fieldName, value) => {
      fields[fieldName] = value;
    });

    busboy.on("finish", () => {
      resolve(fields);
    });

    // 传入解码后的二进制buffer
    busboy.write(bodyBuffer);
    // 主动通知Busboy写入完成,开始收尾解析
    busboy.end();
  });
}

exports.handler = async (event, context) => {
  const fields = await parseMultipartForm(event);
  // 此时字段值为正常字符串,可直接解析
  const parsedValues = JSON.parse(fields.values);
  console.log(parsedValues);
};
验证排查

如果修复后仍然无法解析,可直接打印fields.values的原始内容,确认前端提交表单时是否将JSON对象正确转为字符串传入对应字段,而非传入了二进制、嵌套对象等其他格式数据。

内容的提问来源于stack exchange,提问作者Harsha Murupudi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:12:04