使用带点Node.js模块作为AWS Lambda处理程序报“Bad handler”错误
没错,你遇到的这个报错确实是因为Lambda处理程序的模块文件名里不能直接使用点!
为什么会触发这个错误?
AWS Lambda的处理程序格式规则是[模块名].[导出的函数名],这里的「模块名」指的是你的JavaScript文件(不带.js后缀)。当你指定app.lambda.handler时,Lambda会按照模块嵌套的逻辑去查找:
- 先找名为
app的模块(也就是app.js文件) - 再尝试从这个模块里读取
lambda属性,最后找handler函数
但你的实际文件是app.lambda.js,Lambda完全找不到对应的模块路径,自然就抛出Bad handler app.lambda.handler错误了。
可行的解决方案
根据你的代码拆分需求,这里有几个适配的办法:
直接重命名文件,去掉文件名里的点
比如把app.lambda.js改成appLambda.js或者lambdaApp.js,然后将Lambda处理程序设为appLambda.handler或lambdaApp.handler,这是最直接简单的方案。用文件夹结构替代文件名里的点
如果你想保留类似的命名逻辑,可以创建一个app文件夹,把Lambda相关代码放在里面的lambda.js文件中,目录结构如下:- app/ - lambda.js (在此文件中导出handler函数) - app.js (存放你的通用代码)这时将Lambda处理程序设为
app.lambda.handler,就能让Lambda正确加载app文件夹下的lambda.js模块,找到对应的handler函数。在通用app.js中转导出Lambda处理函数
如果你不想修改文件名或新增文件夹,也可以在app.js中引入app.lambda.js的handler并重新导出:// app.js const lambdaHandler = require('./app.lambda').handler; exports.lambdaHandler = lambdaHandler;然后将Lambda处理程序设为
app.lambdaHandler,就能绕开文件名带点的限制。
内容的提问来源于stack exchange,提问作者villasv

