AWS Lambda运行报「out/get-user-messages.handler未定义或未导出」问题问询
out/get-user-messages.handler is undefined or not exported 报错的核心是Lambda运行时加载指定模块后,找不到handler属性导出,按以下顺序排查:
1. 确认Lambda控制台handler配置正确
检查Lambda函数配置页的「运行时设置」中,处理程序填写的是out/get-user-messages.handler,不要多写.js后缀,也不要漏写out/前缀。
2. 本地验证编译产物的导出是否正常
在项目根目录新建测试文件test-export.js,写入以下代码:
const mod = require('./out/get-user-messages.js'); console.log('导出内容:', mod); console.log('handler是否存在:', !!mod.handler);
运行node test-export.js,如果打印的handler为undefined,说明编译环节存在问题,继续往下排查。
3. 修复webpack配置错误
当前webpack配置存在两处直接导致导出失败的问题:
- 删掉
output配置中的library: "[name]"字段:该配置会把模块导出挂载到和文件名同名的属性下,导致你需要通过require(...).['get-user-messages'].handler才能拿到handler,和Lambda要求的require(...).handler不符。 - 把
libraryTarget: 'commonjs'改为libraryTarget: 'commonjs2':CommonJS2是Node.js生态通用的模块导出规范,适配Lambda运行时的加载逻辑。
修改后output配置参考:
output: { path: path.join(__dirname, "./out"), filename: "[name].js", libraryTarget: 'commonjs2' }
另外注意你当前webpack配置中重复声明了两次module字段,JS对象重复声明会导致前面的配置被覆盖,建议删掉冗余的第一个module配置,避免其他未知问题。
4. 可选:调整babel模块编译配置
如果你调整webpack后导出还是异常,把.babelrc中@babel/preset-env的modules: false改为modules: 'commonjs',强制babel把ES模块转为CommonJS模块,保证export const handler可以正确转为exports.handler。
5. 确认部署包结构正确
解压你上传的zip包,确认解压后的根目录直接存在out文件夹,而不是先有一层项目名称文件夹再包含out。如果是后者,要么调整打包逻辑把out文件夹和依赖直接打到zip根目录,要么把Lambda的handler配置改为[项目文件夹名]/out/get-user-messages.handler。
内容的提问来源于stack exchange,提问作者shoop

