如何使用AppSync + DynamoDB自动生成全局ID

for*_*orJ 6 amazon-web-services amazon-dynamodb aws-appsync

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

我有一个看起来像下面的类型

type Post {
    id: ID!
    creator: String!
    createdAt: String!
    like: Int!
    dislike: Int!
    frozen: Boolean!
}
Run Code Online (Sandbox Code Playgroud)

和输入如下所示

input CreatePostInput {
    id: ID!
    creator: String!
    createdAt: String!
    like: Int!
    dislike: Int!
    frozen: Boolean!
}
Run Code Online (Sandbox Code Playgroud)

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

createPost(input: CreatePostInput!): Post
Run Code Online (Sandbox Code Playgroud)

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

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

我无法插入帖子而不必知道当前id正在做什么。在插入表之前,有什么方法可以提供null,也可以提供任何随机值idDynamoDB或者AppSync自动创建下一个索引吗?

我更新时input CreatePostInput不接受任何错误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)"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我的解析器模板

{
    "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)
}
Run Code Online (Sandbox Code Playgroud)

vah*_*det 5

首先,将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",
    },
  },
}
Run Code Online (Sandbox Code Playgroud)

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

input CreatePostInput {
  creator: String!
  createdAt: String!
  like: Int!
  dislike: Int!
  frozen: Boolean!
}
Run Code Online (Sandbox Code Playgroud)

保存两个更改,您应该完成。

如果您是像我一样眼见为实的人,请看一下这个egghead.io 视频