AWS lambda函数错误-无法导入模块“索引”:错误

时间:2018-09-12 19:24:01

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

我正在尝试在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吗?

解决这一问题的任何指针都将有所帮助,因为我们为此苦苦挣扎了几天

谢谢

更多详细信息

  1. 我们可以通过删除node_modules文件夹,然后在本地运行lambda来重现错误
  2. 如果我删除所有依赖项,则一条简单的日志记录语句将起作用。
  3. lambda在aws中使用节点8.10

答案(@Kannaiyan)

将zip任务更改为:

gulp.task('npm-install', () => gulp.src('./package.json')
  .pipe(gulp.dest('build/'))
  .pipe(install({ production: true })));

为我工作。

2 个答案:

答案 0 :(得分:2)

  

无法导入模块“索引”:错误

您的某些依赖项似乎已安装/未正确打包。删除node_modules目录,然后使用npm install重新安装该模块即可解决此问题。

确保按照文档https://docs.aws.amazon.com/lambda/latest/dg/nodejs-create-deployment-pkg.html

所述打包函数

如果您的捆绑包错过了一个node_module,那么它将导致此错误。

EDIT1:

您在吞咽包装方面遇到了问题。

以下示例包含将lambda与gulp打包的完整文档。

https://medium.com/@AdamRNeary/a-gulp-workflow-for-amazon-lambda-61c2afd723b6

希望有帮助。

答案 1 :(得分:0)

在使用CloudFormation创建 AWS :: Serverless :: Function 并使用InlineCode指定代码时也出现了此错误,其中代码引用了未捆绑在其中的依赖项。选择运行时。

请注意,运行时包含一些软件包 (例如,nodejs8.10似乎至少具有aws-sdk和util)。