使用TypeScript配置Serverless Lambda部署GraphQL API遇模块错误求助
问题分析与解决
问题1:TypeScript部署时出现「Error: Cannot find module 'lambda'」
核心原因:
- Serverless框架默认查找编译后的JavaScript文件,但你直接使用未编译的
.ts文件,且未配置TypeScript自动编译流程。 lambda.ts中导入app的方式错误:app.ts使用export default app导出,你却用import {app} from './app'导入,会导致导入失败,间接引发模块查找问题。
解决步骤:
- 安装TypeScript相关依赖
在项目根目录执行:npm install typescript @types/node @types/express @types/cors serverless-plugin-typescript --save-dev - 修改
serverless.yml,添加TypeScript插件
加入plugins字段让Serverless自动编译TS:service: graphql-api frameworkVersion: '3' provider: name: aws runtime: nodejs18.x # 建议升级,node12已停止维护 region: us-east-1 plugins: - serverless-plugin-typescript functions: serverlessApi: handler: lambda.handler - 修正
lambda.ts的导入语句
匹配app.ts的默认导出方式:import app from './app'; import {serverless} from 'serverless-http'; export const handler = serverless(app); - 添加
tsconfig.json(若未存在)
基础配置示例:{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }, "include": ["*.ts", "api-schema/**/*.ts", "login-middleware.ts"] }
问题2:转为JavaScript后出现「Cannot find module './app'」
核心原因:仅将lambda.ts改为lambda.js,但app.ts仍为TypeScript文件,Node.js无法直接加载.ts文件,必须先编译为.js。
解决步骤:
- 编译所有TypeScript文件为JavaScript
在项目根目录执行:
确保tsctsconfig.json的outDir指向正确目录(如./dist)。 - 调整
lambda.js的导入路径
若编译后的app.js在根目录,保持:
若编译到const app = require('./app'); const serverless = require('serverless-http'); module.exports.handler = serverless(app);dist目录,则修改为:const app = require('./dist/app'); - 更新
serverless.yml的handler路径
若编译到dist目录,handler指向编译后的文件:functions: serverlessApi: handler: dist/lambda.handler
额外建议
- 优先使用维护中的Node.js版本,避免兼容性问题。
- 部署前用
serverless offline在本地测试,提前排查模块导入错误。
内容的提问来源于stack exchange,提问作者user3349255
相关产品推荐
相关产品推荐

