无法获取 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}