如何解决无法获取 TableName 无服务器框架:参数中缺少必需的键“TableName”
我首先按照这个 YouTube tutorial 尝试使用无服务器框架开发无服务器 rest api。它给出了 MissingrequiredParameter 和初始化表名称为 undefined 的错误。
为了缓解这种情况,我在 GitHub 上找到了一个类似的代码,但部署它也会出现同样的错误。
云表控制台日志如下:
2021-06-19T23:12:12.606Z 97a3c3b8-375b-4e12-9b89-7ad1e44f1873 INFO Error saving the kitten to the DB: MissingrequiredParameter: Missing required key 'TableName' in params
at ParamValidator.fail (/var/task/node_modules/aws-sdk/lib/param_validator.js:50:37)
at ParamValidator.validateStructure (/var/task/node_modules/aws-sdk/lib/param_validator.js:61:14)
at ParamValidator.validateMember (/var/task/node_modules/aws-sdk/lib/param_validator.js:88:21)
at ParamValidator.validate (/var/task/node_modules/aws-sdk/lib/param_validator.js:34:10)
at Request.VALIDATE_ParaMETERS (/var/task/node_modules/aws-sdk/lib/event_listeners.js:132:42)
at Request.callListeners (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
at callNextListener (/var/task/node_modules/aws-sdk/lib/sequential_executor.js:96:12)
at /var/task/node_modules/aws-sdk/lib/event_listeners.js:86:9
at finish (/var/task/node_modules/aws-sdk/lib/config.js:386:7)
at /var/task/node_modules/aws-sdk/lib/config.js:404:9 {
code: 'MissingrequiredParameter',time: 2021-06-19T23:12:12.603Z
}
2021-06-19T23:12:12.606Z 97a3c3b8-375b-4e12-9b89-7ad1e44f1873 DEBUG putParams: { TableName: undefined,Item: { name: 'Fluffy',age: 4 } }
它给出了错误 502 Bad Gateway
serverless.yaml 文件
service: lambda-kittens-app
provider:
name: aws
runtime: nodejs12.x
iamRoleStatements:
- Effect: 'Allow'
Action:
- dynamodb:PutItem
- dynamodb:Scan*
- dynamodb:GetItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: arn:aws:dynamodb:#{AWS::Region}:#{AWS::AccountId}:table/${self:service}-kittens-${opt:stage}
environment:
DYNAMODB_KITTEN_TABLE: ${self:service}-kittens-${opt:stage}
functions:
create:
handler: handler.createKitten
events:
- http:
path: /v1/kitten
method: post
list:
handler: handler.listKitten
events:
- http:
path: /v1/kitten
method: get
get:
handler: handler.getKitten
events:
- http:
path: /v1/kitten/{name}
method: get
update:
handler: handler.updateKitten
events:
- http:
path: /v1/kitten/{name}
method: patch
delete:
handler: handler.deleteKitten
events:
- http:
path: /v1/kitten/{name}
method: delete
resources:
Resources:
kittensTable:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: ${self:service}-kittens-${opt:stage}
AttributeDeFinitions:
- AttributeName: name
AttributeType: S
KeySchema:
- AttributeName: name
KeyType: HASH
BillingMode: PAY_PER_REQUEST
Plugins:
- serverless-pseudo-parameters
# Outputs:
# NewOutput:
# Description: "Description for the output"
# Value: "Some output value"
对 db-handler.js 所做的更改
AWS.config.update({ region: 'us-east-1' });
感谢帮助。谢谢!
解决方法
错误消息表明您使用的是 Tablename
,而不是 TableName
。
没有看到您的应用程序代码,我无法确定。 但是我认为你正在做这样的事情:
const documentClient = new DynamoDB.DocumentClient({ params: { TableName: process.env.DYNAMODB_KITTEN_TABLE } });
... // Put call
我注意到在您的 serverless.yml
中,environment:
块位于根级别。这行不通,因此您的环境变量未定义/未设置。
environment
块位于 provider
块内部或 function
块内部(取决于您是要为每个函数设置一个 env var,还是为堆栈中的所有函数设置一个 env var ):
provider:
name: aws
runtime: nodejs12.x
environment:
DYNAMODB_KITTEN_TABLE: ${self:service}-kittens-${opt:stage}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。