38

从 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)"
  ]
}
4

13 回答 13

21

我能够让它工作的方式是:

  1. 将文件命名为exports.js
  2. 在文件中命名处理程序,exports.handler
  3. 将 lambda 配置中的处理程序设置为 exports.handler
  4. 仅压缩文件夹的内容,而不是文件夹本身(如上所述)并将压缩文件重命名为exports.zip
于 2015-09-12T16:42:44.737 回答
13

好的,我自己做了这个,只要确保你制作的 .js 文件不会在文件夹中结束,因为 AWS 会解压缩你上传的文件并尝试找到一个名为 .js 的文件你给的处理程序,如果它在一个文件夹中,它不会帮助你。

于 2015-08-11T03:52:26.843 回答
9

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

在此处输入图像描述

于 2019-01-29T17:47:47.183 回答
5

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

例如,对于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
于 2019-04-16T14:44:31.617 回答
5

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

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

于 2016-09-14T08:20:10.190 回答
2

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

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

chmod -R +r node_modules

然后压缩并上传。

于 2018-05-01T16:05:56.297 回答
1

我在 node_modules 目录中构建的自定义模块上遇到了这个问题。在我的 Win10 机器上测试一切都运行良好,但上传时我一直收到同样的“找不到模块‘模块名称’”错误。

原来我有一个不匹配;这是无法找到的模块中的 package.json 行:

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

这是实际的文件名:

Modulename.js

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

于 2016-09-18T04:03:48.937 回答
1

这是我遵循的来自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

现在您的函数已准备好运行!

于 2021-08-11T08:01:53.683 回答
0

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

CreateThumbnail.js
/node_modules/gm
/node_modules/async

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

所以这就是你必须做的:

  1. 将目录更改为项目文件夹中的 node_modules 文件夹,然后运行命令“ npm install gm async ”。这将在此文件夹中安装 gm、async 及其所有依赖项。
  2. 现在将“CreateThumbnail.js”文件和完整的“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
于 2018-04-27T09:58:11.610 回答
0

这对我来说很简单。

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

尝试调用您的主文件 CreateThumbnail.js

于 2016-08-31T13:17:04.247 回答
0

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

于 2016-04-21T19:38:14.360 回答
0

这是无关的,但谷歌把我带到了这里,所以:

AWS 会给你一个错误:

Unable to import module '<myfile>': Error

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

于 2018-09-11T13:57:55.643 回答
-1

文件名:
app.js
“app.js”中的 Lambda 函数:
exports.handler = function(event, context)...
Amazon 控制台上的 Lambda 处理程序:
app.handler ( {app}.js + exports.{handler} =应用程序处理程序

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

于 2016-11-04T11:11:54.677 回答