aws-lambda无法找到模块

时间:2015-06-06 02:31:31

标签: javascript node.js amazon-web-services aws-lambda

从zip文件上传代码时,我在aws-lambda控制台中一直收到此错误。我尝试上传其他zip文件,但它们正常工作。 .js文件在zip文件中名为“CreateThumbnail.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)"
  ]
}

13 个答案:

答案 0 :(得分:15)

我能够让它发挥作用的方式是:

  1. 将文件命名为exports.js
  2. 在文件中命名处理程序exports.handler
  3. 将lambda配置中的处理程序设置为exports.handler
  4. 仅压缩文件夹的内容,而不是文件夹本身(如上所述)并重命名zip文件exports.zip

答案 1 :(得分:8)

好的,我自己做了这个,只是确保你制作拉链,使.js文件不会在文件夹中结束,因为AWS会解压缩你上传的文件并试图找到.js文件由您提供的处理程序的名称,如果它在一个文件夹中,它不会帮助您。

答案 2 :(得分:4)

如果您的压缩文件没有全球读取权限,则会显示此确切错误。 (chmod -R ugo+r)。

在压缩前检查文件权限。不幸的是,AWS并没有强调这一点,这给许多人带来了很多麻烦。

答案 3 :(得分:1)

我在node_modules目录中构建的自定义模块上遇到此问题。在我的Win10机器上进行测试时,一切运行良好,但上传后我仍然得到相同的“找不到模块'modulename'”错误。

事实证明我错了;这是无法找到的模块中的package.json行:

"main": "./build/modulename.js",

这是实际的文件名:

Modulename.js

区分大小写; Windows不是,linux(因此也就是AWS)。

答案 4 :(得分:1)

某些库文件可能没有全局读取,因此lambda将无法读取内容并构建内容。

确保node_modules中的所有文件在打包前都可读:

chmod -R +r node_modules

然后压缩并上传。

答案 5 :(得分:1)

一个可能的问题是,如果您将lambda作为通过PowerShell Compress-Archive创建的zip文件上传。 Compress-Archive has a bug使AWS将文件提取到平面树(无子目录)中,文件名中带有反斜杠:

enter image description here

答案 6 :(得分:0)

AWS Lambda使用文件的名称和处理程序函数的名称,因此如果您在名为exports.myHandler = function(event, context)的文件中定义了这样的处理程序:index.js,则处理程序为{{1} }。

答案 7 :(得分:0)

这对我来说简单。

我得到了,无法创建索引。在我的例子中,我的带有exports.handler的主lambda文件必须被称为index.js

尝试调用主文件CreateThumbnail.js

答案 8 :(得分:0)

文件名:
app.js
&strong;" app.js" 中的 Lambda函数
exports.handler = function(event,context)...
亚马逊控制台上的Lambda处理程序:
app.handler( {app} .js + exports。{handler} = app.handler

解压缩文件夹时,您应该看到:
app.js
node_modules

答案 9 :(得分:0)

本教程告诉您在zip文件中包含以下项目:

  

CreateThumbnail.js
  / node_modules /克
  / node_modules /异步

它未能考虑的是两个软件包(gm,async)的依赖关系也需要成为软件包的一部分。

所以这就是你要做的事情:

  1. 将目录更改为项目文件夹中的node_modules文件夹,然后运行命令' npm install gm async '。这将在此文件夹中安装gm,async及其所有依赖项。
  2. 现在打包' CreateThumbnail.js'文件和 完成 ' node_modules'将文件夹放入zip文件并上传。它应该现在可以工作。
  3. 所以你的完整包应该是这样的:

    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
    

答案 10 :(得分:0)

这无关紧要,但是Google将我带到了这里,所以:

AWS会给您一个错误:

Unable to import module '<myfile>': Error

对我而言,真正发生的事情是需要一个不存在的JS文件。该错误有点误导人。

答案 11 :(得分:0)

如果您使用的是AWS Lambda Layers,则需要验证您的目录结构是否在图层所需的结构上:

例如,对于moment.js 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

答案 12 :(得分:0)

这是我遵循的 https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html 的说明,并且有效。

使用依赖项更新 Node.js 函数

打开命令行终端或 shell。确保您本地环境中的 Node.js 版本与您的函数的 Node.js 版本匹配。

为部署包创建一个文件夹。以下步骤假定文件夹名为 my-function。

使用 npm install 命令在 node_modules 目录中安装库。

npm install the_package_that_is_missing

创建一个包含项目文件夹内容的 .zip 文件。使用 r(递归)选项确保 zip 压缩子文件夹。

zip -r function.zip .

使用 update-function-code 命令上传包。

aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip

现在您的函数可以运行了!