我在Lambda上遇到了一个非常不幸的错误:
Unable to import module 'lib/index': Error
at require (internal/module.js:20:19)
这很奇怪,因为肯定有一个名为handler
的函数从lib/index
导出...不确定整个子目录是否对其他人来说是个问题所以我想问一下。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Does something crazy
Resources:
SomeFunction:
Type: AWS::Serverless::Function
Properties:
Handler: lib/index.handler
Role: arn:aws:iam::...:role/lambda-role
Runtime: nodejs6.10
Timeout: 10
Events:
Timer:
Type: Schedule
Properties:
Schedule: rate(1 minute)
|-- lib
| `-- index.js
`-- src
`-- index.js
我已经在这里嵌套了,因为我在构建过程中使用以下内容来编译ES6,摘自package.json
:
"build": "babel src -d lib"
version: 0.1
phases:
install:
commands:
- npm install
- aws cloudformation package --template-file sam-template.yaml --s3-bucket some-bucket --output-template-file compiled-sam-template.yaml
build:
commands:
- npm run build
post_build:
commands:
- npm prune --production
artifacts:
files:
- 'node_modules/**/*'
- 'lib/**/*'
- 'compiled-template.yaml'
答案 0 :(得分:2)
您正在尝试导入lib/index
,它会尝试查找名为lib
的包,就像您npm install --save lib
一样,但您最有可能尝试导入相对于您自己项目的文件并且你没有在导入中给它一个相对路径。
将'lib/index'
更改为'./lib/index'
- 或'../lib/index'
等 - 取决于具体位置,看看是否有帮助。
顺便说一句,如果您尝试导入文件lib/index.js
而不是目录lib/import/
,那么您可以使用较短的./lib
路径,如:
const lib = require('./lib');
当然,你甚至没有显示一行代码,所以我只能猜出你在做什么。
答案 1 :(得分:2)
aws cloudformation package
命令正在运送构建的资产,该资产在显示的代码的install
阶段运行。将其移至post_build
将确保其捕获所需的所有内容,包括相关的lib/index
:
post_build:
commands:
- npm prune --production
- aws cloudformation package ...
答案 2 :(得分:0)
对处理程序的引用必须与要执行的 lambda 相关;
例如: 如果文件 lambda 放在路径中:
x-lambda/yyy/lambda.py
处理程序必须是:
..yyy/lambda.lambda_handler
假设在 lambda.py 中存在函数: lambda_handler()