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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:20:58