Node.js 14环境下AWS Lambda出现Runtime.HandlerNotFound错误如何解决
根因定位
从报错日志的警告信息Accessing non-existent property 'handler' of module exports inside circular dependency可以判断,问题出在两方面:要么Lambda运行时找不到正确的index.js文件,要么模块循环依赖导致handler属性在加载时未完成挂载。
可能的原因及对应解决方法
部署包路径错误
绝大多数此类问题都是打包方式不对导致的:如果你本地代码存放在单独的项目文件夹里,打包时直接打包了整个文件夹,会导致解压后index.js存放在部署包的二级目录下,Lambda运行时默认在根目录查找index.js,自然找不到对应的handler。
解决方法:打包时进入项目根目录,选中所有文件(包括index.js、node_modules等)直接打包,不要打包外层的项目文件夹。可以直接在Lambda控制台的代码编辑器里在线粘贴你的index.js代码测试,如果在线编辑可以正常运行,即可确认是本地打包路径问题。模块循环依赖
如果你的index.js里引入了其他自定义模块,而被引入的模块又反过来引用了index.js,就会形成循环依赖:Node.js加载模块时会先导出一个空的exports对象,再执行模块代码挂载属性,循环依赖的场景下,运行时读取index.handler的时候,handler还没被挂载到exports上,就会报未定义的错误。
解决方法:- 调整代码结构,去掉不必要的循环依赖
- 把
handler的导出语句放在所有require语句之前,确保加载时handler已提前挂载,示例如下:
// 优先导出handler exports.handler = async function(event, context) { console.log("Hello ..."); return "hey"; } // 再加载其他依赖 const utils = require('./utils');代码拼写错误
检查本地index.js的导出语句是否拼写正确,比如不要把exports.handler误写为export.handler、exports.Handler,大小写和拼写错误都会导致找不到导出的属性。
内容的提问来源于stack exchange,提问作者shagg ing

