Javascript aws lambda找不到模块

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"

从zip文件上载代码时,我在aws lambda控制台中不断遇到此错误。我试过上传其他zip文件,它们工作正常。js文件在zip文件中命名为“create缩略图.js”。我相信处理程序也被正确地命名为“CreateThumbnail.handler”。还设置了node_modules子目录。有人知道吗

{
  "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文件,如果它在文件夹中,则不会对您有所帮助。

我实现此功能的方法是:

  • 将文件命名为exports.js
  • 将文件中的处理程序命名为exports.handler
  • 将lambda配置中的处理程序设置为exports.handler
  • 仅压缩文件夹的内容,而不是文件夹本身(如上所述),然后重命名Zip文件exports.Zip

  • 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“压缩”将所有内容都放在一个文件夹中(它应该放在文件夹中),那么很容易就会遇到这种情况。这节省了我的时间,因为我尝试导出当前代码,导出时它将所有内容都放在一个文件夹中,所以我认为在上载时也需要一个文件夹