使用AppSync
和DynamoDB
作为数据库源时如何自动生成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
,而DynamoDB
或AppSync
会在插入表之前自动创建下一个索引?
我将
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)
}
答案 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)
}