【问题标题】:How to autogenerate global ID using AppSync + DynamoDB如何使用 AppSync + DynamoDB 自动生成全局 ID
【发布时间】:2018-12-20 07:59:46
【问题描述】:

当我使用AppSyncDynamoDB作为数据库源时,如何自动生成ID?

我的类型如下所示

type Post {
    id: ID!
    creator: String!
    createdAt: String!
    like: Int!
    dislike: Int!
    frozen: Boolean!
}

输入如下所示

input CreatePostInput {
    id: ID!
    creator: String!
    createdAt: String!
    like: Int!
    dislike: Int!
    frozen: Boolean!
}

而我的变异显然是两者的结合

createPost(input: CreatePostInput!): Post

但是,当我进行插入时,我必须执行以下操作

mutation createPost{
  createPost(input:{
    id:2
    creator:"some creator"
    createdAt:"some date"
    like:0
    dislike:0
    frozen:false
  }){
    id
    creator
    createdAt
    like
    dislike
    frozen
  }
}

如果不知道id 现在在做什么,我就无法插入帖子。有没有办法我可以提供null 或任何随机的idDynamoDBAppSync 在插入表之前自动创建下一个索引?

当我将input CreatePostInput 更新为 not 时产生错误 接受任何ID

{
  "data": {
    "createPost": null
  },
  "errors": [
    {
      "path": [
        "createPost"
      ],
      "data": null,
      "errorType": "DynamoDB:AmazonDynamoDBException",
      "errorInfo": null,
      "locations": [
        {
          "line": 2,
          "column": 3,
          "sourceName": null
        }
      ],
      "message": "One or more parameter values were invalid: Type mismatch for key id expected: S actual: NULL (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: 629QEM7MH9BRAJ9MHU3FM1S0U3VV4KQNSO5AEMVJF66Q9ASUAAJG)"
    }
  ]
}

我的解析器模板

{
    "version" : "2017-02-28",
    "operation" : "PutItem",
    "key" : {
        ## If object "id" should come from GraphQL arguments, change to $util.dynamodb.toDynamoDBJson($ctx.args.id)
        "id": $util.dynamodb.toDynamoDBJson($util.autoId()),
    },
    "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
}

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb aws-appsync


    【解决方案1】:

    首先,将createPost 解析器更新为:

    {
      "version": "2017-02-28",
      "operation": "PutItem",
      "key": {
        "id": $util.dynamodb.toDynamoDBJson($util.autoId()),
      },
      "attributeValues": $util.dynamodb.toMapValuesJson($ctx.args.input),
      "condition": {
        "expression": "attribute_not_exists(#id)",
        "expressionNames": {
          "#id": "id",
        },
      },
    }
    

    然后,从您的 CreatePostInput 输入类型中删除 id 字段:

    input CreatePostInput {
      creator: String!
      createdAt: String!
      like: Int!
      dislike: Int!
      frozen: Boolean!
    }
    

    保存这两项更改,您就应该完成了。

    如果您是像我这样眼见为实的人,请查看egghead.io video

    【讨论】:

      【解决方案2】:

      您可以使用 $util.autoId() 速度辅助函数自动生成 UUIDv4。例如,您可以编写一个 createPost 解析器,它使用这样的服务器端生成的 id。

      {
          "version" : "2017-02-28",
          "operation" : "PutItem",
          "key" : {
              "id": $util.dynamodb.toDynamoDBJson($util.autoId()),
          },
          "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
      }
      

      【讨论】:

      • 对不起,我忘了包括那部分。我的解析器看起来和你写的完全一样。您对可能出现的问题有什么建议吗?
      • 如果您使用的是 $util.autoId() ,则不必将 id 作为输入的一部分传递。您可以尝试从创建输入中删除 Id 字段并调用突变吗?如果您没有得到我为您生成的信息,请确保您使用的是 $util.autoId()
      • 是的,我也尝试过,但它返回了我在问题更新中指定的错误。如果您在AppSync 应用程序中使用相同的方法并且$util.autoId() 对您有用,您能否帮我确认一下?
      • 我已将其粘贴在我的问题上
      猜你喜欢
      • 1970-01-01
      • 2022-08-16
      • 2018-06-22
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 2014-04-25
      • 2016-02-06
      • 1970-01-01
      相关资源
      最近更新 更多