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

时间:2018-07-12 07:28:43

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

使用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或任何随机id,而DynamoDBAppSync会在插入表之前自动创建下一个索引?

  

我将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)
}

2 个答案:

答案 0 :(得分:2)

首先,将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",
    },
  },
}

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

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

保存所有更改,您应该已完成。

如果您是像我这样有见识的人之一,请看看这个egghead.io video

答案 1 :(得分:0)

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

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