本地正常的Lambda部署到AWS后报502及语法错误求助
解决AWS Lambda部署后出现SyntaxError: Unexpected token '??='的问题
问题根源
虽然你的代码里没用到??=(ES2021空值合并赋值运算符),但这个错误说明打包后的代码或依赖包中存在该语法,而AWS Lambda的Node.js运行时版本不支持,或者webpack打包时未完成转译。本地运行正常是因为本地Node.js版本支持该语法,而Lambda默认的旧版本不支持。
具体解决方案
1. 升级Lambda的Node.js运行时版本
AWS Lambda的Node.js 14.x及以下版本不支持ES2021语法,需将Lambda函数的运行时升级到16.x及以上(推荐18.x或20.x):
- 在
serverless.yaml的provider字段中指定Node.js版本:provider: name: aws runtime: nodejs20.x # 替换为支持ES2021的版本 # 其他配置... - 重新部署服务:
sls deploy
2. 完善webpack+Babel转译配置
确保所有代码(包括依赖包中的新语法)都被转译为Lambda运行时支持的语法:
- 安装必要依赖:
npm install --save-dev @babel/core @babel/preset-env @babel/preset-typescript babel-loader webpack webpack-cli - 修改
webpack.config.js,添加完整的转译配置:module.exports = { entry: './src/handler.ts', target: 'node', mode: process.env.NODE_ENV || 'production', module: { rules: [ { test: /\.(ts|js)$/, // 若依赖包含新语法,可去掉exclude或指定要转译的包 // exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: [ ['@babel/preset-env', { targets: { node: '20' }, // 和Lambda运行时版本一致 useBuiltIns: 'usage', corejs: 3 }], '@babel/preset-typescript' ] } } } ] }, resolve: { extensions: ['.ts', '.js'] }, output: { libraryTarget: 'commonjs2', filename: 'handler.js', path: __dirname + '/dist' }, externals: { 'aws-sdk': 'aws-sdk' // 排除AWS SDK,Lambda环境自带 } }; - 调整
serverless.yaml中的webpack配置,指向正确的打包输出:custom: webpack: webpackConfig: ./webpack.config.js packager: 'npm' includeModules: false # 若用babel转译所有依赖,设为false避免重复打包 # 其他配置... functions: myApi: handler: dist/handler.service # 指向webpack打包后的handler文件 # 其他配置...
3. 排查依赖包
若升级运行时和完善转译后仍报错,检查依赖包是否使用新语法:
- 执行
npm ls查看依赖树,定位可能引入新语法的包 - 尝试降级相关依赖到兼容旧Node版本的版本,或替换为更稳定的替代包
4. 本地模拟Lambda测试
用serverless invoke local命令在本地模拟Lambda执行,快速排查打包后的代码问题:
sls invoke local --function myApi
内容的提问来源于stack exchange,提问作者user6680
相关产品推荐
相关产品推荐

