使用Serverless Framework部署Nuxt3到AWS Lambda遇语法错误求助
解决AWS Lambda部署Nuxt3 SSR时的"SyntaxError: Cannot use import statement outside a module"错误
核心问题
AWS Lambda默认采用CommonJS模块系统执行代码,而你的handler文件使用了ES模块的import语法,同时Nitro打包的产物也是ES模块,导致模块系统冲突。
解决方案
1. 将handler文件转为ES模块
有两种可行方式:
方式一:重命名handler文件
把handler.js改名为handler.mjs,AWS Lambda会自动识别这是ES模块文件。方式二:添加package.json声明模块类型
在handler文件所在目录创建package.json,内容如下:{ "type": "module" }
2. 调整serverless.yaml中的handler配置
如果用了方式一重命名为handler.mjs,需要同步修改serverless.yaml里的handler路径:
functions: ssr: handler: handler.mjs.runner # 改为.mjs后缀 timeout: 15 package: individually: true include: - output/** events: - httpApi: path: '*' method: '*'
3. 优化Nitro打包流程,避免手动重命名文件夹
修改nitro.config.ts,直接指定输出目录为output,省去手动改名的步骤:
import { defineNitroConfig } from 'nitropack'; export default defineNitroConfig({ preset: 'aws-lambda', serveStatic: true, output: { dir: './output' // 直接输出到output目录 } });
执行yarn build后会自动生成output文件夹,无需手动修改。
4. 修正handler中的逻辑错误
原handler硬编码了rawPath: '/',应该使用Lambda传入的真实请求事件,同时注意Nitro的handler是异步函数,需要用async/await处理:
import { handler } from './output/server/index.mjs'; export const runner = async (event, context) => { // 转换Lambda请求事件为Nitro兼容格式 const nitroEvent = { rawPath: event.rawPath || event.path, method: event.requestContext.http.method, headers: event.headers, query: event.queryStringParameters, body: event.body, rawBody: event.body }; const response = await handler(nitroEvent); return { statusCode: response.statusCode, headers: response.headers, body: response.body }; };
内容的提问来源于stack exchange,提问作者bensiu
相关产品推荐
相关产品推荐

