Nuxt3部署至AWS Lambda后readMultipartFormData无法解析FormData
Nuxt3部署AWS Lambda后FormData解析失败的解决方法
核心原因
AWS Lambda接收的HTTP请求body默认会被Base64编码,而Nuxt的readMultipartFormData方法默认处理原始二进制数据,未适配Base64解码逻辑,导致无法解析FormData内容。本地环境中请求body为原始二进制格式,因此能正常运行。
修复步骤
1. 解码Base64格式的请求body
在server/api/s3.js中,先判断请求是否为Base64编码,若是则解码后再传给readMultipartFormData处理。
2. 按字段名取值而非依赖数组索引
原代码通过body[0]、body[1]的数组索引取值,依赖FormData字段的传递顺序,容易因字段顺序变化导致错误。改为按字段名精准查找对应数据。
修改后的完整代码
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; import { readMultipartFormData } from "nuxt/app"; export default defineEventHandler(async (event) => { // 处理Lambda的Base64编码body if (event.node.req.isBase64Encoded) { // 将Base64字符串解码为Buffer,替换原始body event.node.req.body = Buffer.from(event.node.req.body, "base64"); } // 解析FormData const formData = await readMultipartFormData(event); if (!formData) { throw createError({ statusCode: 400, message: "无效的FormData格式" }); } // 按字段名提取数据 const key = formData.find(item => item.name === "Key")?.data.toString(); const fileBody = formData.find(item => item.name === "Body")?.data; const contentType = formData.find(item => item.name === "ContentType")?.data.toString(); if (!key || !fileBody || !contentType) { throw createError({ statusCode: 400, message: "缺少必要的FormData字段" }); } const config = useRuntimeConfig(); const client = new S3Client({ region: config.s3Region, credentials: { secretAccessKey: config.s3SecretKey, accessKeyId: config.s3AccessKey, }, }); try { const command = new PutObjectCommand({ Bucket: config.s3Bucket, Key: key, Body: fileBody, ContentType: contentType, Tagging: "expiration-days=1d", }); const response = await client.send(command); return { success: true, data: response }; } catch (error) { throw createError({ statusCode: 500, message: "上传S3失败", details: error.message }); } });
额外注意事项
- Lambda内存配置:上传大文件时,确保Lambda分配至少512MB内存,避免解码或文件处理阶段内存不足。
- 请求大小限制:Lambda默认允许的请求大小为6MB,若需上传更大文件,需配置API Gateway的payload限制(最大支持10MB),或改用S3分片上传方案。
- CORS配置:确保Nuxt的CORS规则允许前端发起跨域请求,避免OPTIONS预请求失败导致上传中断。
内容的提问来源于stack exchange,提问作者AngusHo53
相关产品推荐
相关产品推荐

