首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法获取TableName Serverless框架:在params中缺少必需的键“TableName”

无法获取TableName Serverless框架:在params中缺少必需的键“TableName”
EN

Stack Overflow用户
提问于 2021-06-19 22:54:40
回答 3查看 3.2K关注 0票数 3

我首先遵循这个YouTube教程,尝试使用无服务器框架开发一个无服务器的rest。它给出了一个MissingRequiredParameter错误,并将表名初始化为未定义。

为了缓解这种情况,我在GitHub上找到了类似的代码,但是部署它也会产生同样的错误。

以下是云表中的控制台日志:

代码语言:javascript
复制
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坏网关

serverless.yaml文件

代码语言:javascript
复制
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所做的更改

代码语言:javascript
复制
AWS.config.update({ region: 'us-east-1' });

我们很感激你的帮助。谢谢!

注意:我确实检查了几个解决方案,但似乎都没有效果。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-20 15:52:47

如果没有看到您的应用程序代码,我就无法确定。不过,我想你是在做这样的事:

代码语言:javascript
复制
const documentClient = new DynamoDB.DocumentClient({ params: { TableName: process.env.DYNAMODB_KITTEN_TABLE } });

... // Put call

我在您的serverless.yml中注意到,environment:块位于根级。这将无法工作,因此您的环境变量是未定义的/不设置的。

environment块位于provider块内部或function块内(取决于您想要为每个函数设置env,还是针对堆栈中的所有函数):

代码语言:javascript
复制
provider:
    name: aws
    runtime: nodejs12.x
    environment:
      DYNAMODB_KITTEN_TABLE: ${self:service}-kittens-${opt:stage}
票数 2
EN

Stack Overflow用户

发布于 2021-06-19 22:57:27

错误消息表明您使用的是Tablename,而不是TableName

票数 2
EN

Stack Overflow用户

发布于 2022-05-10 20:13:38

我和tableName有一些问题。我用适当的tableName解决了这个问题。

我的代码是这样的:

代码语言:javascript
复制
const tableName = process.env.COURSE_TABLE;
exports.handler = async (event) => {
    const saveParams = {
        TableName:tableName
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68051340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档