Javascript aws lambda找不到模块
从zip文件上载代码时,我在aws lambda控制台中不断遇到此错误。我试过上传其他zip文件,它们工作正常。js文件在zip文件中命名为“create缩略图.js”。我相信处理程序也被正确地命名为“CreateThumbnail.handler”。还设置了node_modules子目录。有人知道吗Javascript aws lambda找不到模块,javascript,node.js,amazon-web-services,aws-lambda,Javascript,Node.js,Amazon Web Services,Aws Lambda,从zip文件上载代码时,我在aws lambda控制台中不断遇到此错误。我试过上传其他zip文件,它们工作正常。js文件在zip文件中命名为“create缩略图.js”。我相信处理程序也被正确地命名为“CreateThumbnail.handler”。还设置了node_modules子目录。有人知道吗 { "errorMessage": "Cannot find module 'CreateThumbnail'", "errorType": "Error", "stackTrace"
{
"errorMessage": "Cannot find module 'CreateThumbnail'",
"errorType": "Error",
"stackTrace": [
"Function.Module._resolveFilename (module.js:338:15)",
"Function.Module._load (module.js:280:25)",
"Module.require (module.js:364:17)",
"require (module.js:380:17)"
]
}
好的,我是自己做的,只要确保压缩后的.js文件不会出现在文件夹中,因为AWS会解压您上传的文件,并尝试按您提供的处理程序名称查找.js文件,如果它在文件夹中,则不会对您有所帮助。我实现此功能的方法是:
AWS Lambda使用文件名和处理程序函数名,因此如果您像这样定义处理程序:
exports.myHandler=function(event,context)
在名为index.js
的文件中,您的处理程序是index.myHandler,这对我来说是一个简单的处理程序
我正在获取,无法创建索引。在我的例子中,我的主lambda文件中的exports.handler必须被称为index.js
尝试调用您的主文件CreateThumbnail.js如果您的压缩文件没有全球读取权限,则会显示此错误。(chmod-R ugo+R
)
在压缩文件之前检查文件权限。不幸的是,AWS并没有充分强调这一点,这给许多人带来了很多麻烦。我在node_modules目录中构建的自定义模块上遇到了这个问题。在我的Win10机器上进行测试时,一切都正常,但当上传时,我不断收到相同的“找不到模块'modulename'”错误
结果是我有一个错配;以下是模块中找不到的package.json行:
"main": "./build/modulename.js",
下面是实际的文件名:
Modulename.js
区分大小写;Windows不是,linux(因此AWS)是。文件名:
app.js
app.js中的Lambda函数:
exports.handler=函数(事件、上下文)。。。
Amazon控制台上的Lambda处理程序:
app.handler({app}.js+exports.{handler}=app.handler)
解压文件夹时,您会看到:
app.js
node_modules本教程告诉您在zip文件中包括以下项目:
CreateThumbnail.js
/节点\模块/gm
/节点\u模块/异步
它没有考虑的是,两个包(GM,AsiNC)的依赖性也需要是包的一部分。
下面是你必须做的:
将目录更改为项目文件夹中的node_modules文件夹,并运行命令“npm install gm async”。这将在该文件夹中安装gm、async及其所有依赖项
现在将'CreateThumbnail.js'文件和complete'node_modules'文件夹打包成zip文件并上传。现在应该可以了
因此,您的整个软件包应该如下所示:
CreateThumbnail.js
/node_modules/.bin
/node_modules/array-parallel
/node_modules/array-series
/node_modules/async
/node_modules/cross-spawn
/node_modules/debug
/node_modules/gm
/node_modules/isexe
/node_modules/lodash
/node_modules/lru-cache
/node_modules/ms
/node_modules/pseudomap
/node_modules/which
/node_modules/yallist
某些库文件可能没有全局读取,因此lambda将无法读取内容并生成内容
在打包之前,确保node\u模块中的所有文件都是可读的:
chmod -R +r node_modules
然后压缩并上传。这是无关的,但谷歌把我带到了这里,所以:
AWS将给您一个错误:
Unable to import module '<myfile>': Error
无法导入模块“”:错误
真正发生在我身上的是,这需要一个不存在的JS文件。该错误有点误导。一个可能的问题是,如果您将lambda作为通过PowerShell压缩存档创建的zip文件上载,则会出现此问题。这导致AWS将文件提取到一个平面树(无子目录)中,文件名中带有反斜杠:
如果正在使用,则需要验证目录结构是否位于层所需的结构上:
例如,对于node.js模块,您需要以下结构:
aws-lambda-layer.zip
│ nodejs
│ nodejs/node_modules
└ nodejs/node_modules/moment
因此,要创建具有正确结构的图层zip文件,我们可以在项目根目录上使用以下命令:
mkdir -p nodejs && cp -r node_modules nodejs/ && zip -r aws-lambda-layer.zip nodejs
您是否在“更改函数配置和角色”部分中设置了“CreateThumbnail”作为处理程序名称?你能显示你函数的头吗?你确定压缩了文件的内容,而不是文件本身吗?文件的实际名称并不重要。关键是完全限定文件及其路径。我的zip文件有一个名为scripts
的目录,其中有几个文件中有exports.handler
。对于Lamdba控制台中的Handler,我指定,scripts/transforms.Handler
。我使用gulp来构建和生成我的zip文件,使用的是产生这种形式问题的gulp-zip
包。似乎只有当它试图压缩它时才会发生(默认设置),因此使用此选项使它对我有效:.pipe(zip('myfile.zip',{compress:false}))
。谢谢,我在这件事上花了一段时间。抓挠一下..compress:false
不起作用,但是gulp-zip
仍然是罪魁祸首。手动压缩相同的文件有效。这是一个很好的问题。非常感谢。该错误报告中的一个示例说明了如何使用命令行版本7zip
而不是Compress Archive
。这对Mechanpion有效。如果使用OSX“压缩”将所有内容都放在一个文件夹中(它应该放在文件夹中),那么很容易就会遇到这种情况。这节省了我的时间,因为我尝试导出当前代码,导出时它将所有内容都放在一个文件夹中,所以我认为在上载时也需要一个文件夹