【发布时间】:2019-10-10 23:59:11
【问题描述】:
我正在尝试在 nodejs 中创建一个 lambda。按照文档,我创建了一个带有 lambda 函数、node_modules 和 package.json 的 zip 文件。我的 lambda zip 文件的结构如下:
my-lambda-function/
|
|---util/
| |
| |--util-1.js
| |--util-2.js
|---api/
| |
| |--api-call-1.js
| |--api-call-2.js
|
|---config
| |
| |--env/
| | |--env-file-1.js
| |
| |--config-file-1.js
| |--config-file-2.js
|
|---node_modules/
| |
| |--module-1/
| |--module-2/
|---index.js
|---package.json
为了创建这个 zip 文件,我正在使用 gulp 任务,
gulp.task('zip', ['test'], () => {
const buildArtifact = ['index.js', 'package.json', 'util/**',
'config/**', 'api/**'];
Object.keys(pjson.dependencies).forEach((dep) => {
buildArtifact.push(`node_modules/${dep}/**/*`);
});
const zipFile = `${pjson.name}.zip`;
return gulp.src(buildArtifact, { base: '.' })
.pipe(zip(zipFile))
.pipe(gulp.dest('build'));
});
此 lambda 使用 lambda-local 在本地运行。但是在测试这个 lambda 时会抛出错误
Unable to import module 'index': Error
at Function.Module._resolveFilename (module.js:547:15)
at Function.Module._load (module.js:474:25)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/var/task/node_modules/ioredis/built/utils/lodash.js:2:19)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
当前错误指向 ioredis 模块(在 node_modues 文件夹中可用),但如果我从代码中删除 ioredis 的使用(通过删除 ioredis 的导入),则错误将更改为另一个节点模块。
我的 lambda 函数似乎无法加载/找到 node_modules。 是不是因为 lambda 安装 npm 失败?
任何解决此问题的建议都会有所帮助,因为我们已经为此苦苦挣扎了几天
谢谢
更多详情
- 我们可以通过删除 node_modules 文件夹然后在本地运行 lambda 来重现错误
- 如果我删除所有依赖项,一个简单的日志记录语句将起作用。
- lambda 在 aws 中使用节点 8.10
回答 (@Kannaiyan)
将 zip 任务更改为:
gulp.task('npm-install', () => gulp.src('./package.json')
.pipe(gulp.dest('build/'))
.pipe(install({ production: true })));
为我工作。
【问题讨论】:
-
在部署 lambda 时,您还需要上传
node_module。看来您的 lodash 需要一个模块,该模块存在于您的机器中,但不在您的应用程序 node_module 中。 -
我没有直接在我的函数中使用 lodash。但似乎它是从 ioredis 引用的。
-
可能有一些模块使用
lodash和lodash使用不在您的node_module 中的其他NPM 模块。当我们运行应用程序时,这是搜索 NPM 模块的方式,首先搜索你的目录__dirname/node_modules,然后是../node_modules,这将一直持续到机器的root目录。因此,在本地测试时不会出现错误,因为此流程可能会发生,但是在 AWS lambda 中,该模块根本不可用。只需删除所有模块并重新安装即可。 -
谢谢纳文。我暂时通过 AWS 控制台手动上传一个 zip 文件。在 zip 文件中,我可以在 node_modules 文件夹中看到所有必需的 npms。您能否再描述一下 - “删除所有模块并重新安装它们”
标签: node.js amazon-web-services aws-lambda