使用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
相关产品推荐
相关产品推荐

