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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:47:24