Как мне автоматически сгенерировать идентификатор, если я использую AppSync и DynamoDB в качестве источника базы данных?
У меня есть тип, похожий на ниже
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 автоматически создать следующий индекс перед вставкой в таблицу?
Error generated when I update the
input CreatePostInputto not accept anyID
{
"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)"
}
]
}
My Resolver Template
{
"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)
}





Вы можете автоматически сгенерировать UUIDv4 с помощью вспомогательной функции скорости $ util.autoId (). Например, вы можете написать преобразователь createPost, который использует сгенерированный на стороне сервера идентификатор, подобный этому.
{
"version" : "2017-02-28",
"operation" : "PutItem",
"key" : {
"id": $util.dynamodb.toDynamoDBJson($util.autoId()),
},
"attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
}
Если вы используете $ util.autoId (), вам не нужно передавать идентификатор как часть ввода. Можете ли вы попробовать удалить поле Id из ввода create и вызвать мутацию? Если вы не получаете сгенерированный для вас я, пожалуйста, убедитесь, что вы используете $ util.autoId ()
да, я тоже пробовал, но он возвращает ошибку, которую я указал в обновлении вопроса. Не могли бы вы подтвердить для меня, используете ли вы ту же методологию в своем приложении AppSync, и $util.autoId() работает на вас?
Я вставил это в свой вопрос
Сначала обновите распознаватель 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 видео.
извините, я забыл включить эту часть. Мой преобразователь выглядит точно так же, как то, что вы написали. У вас есть предложения, что может пойти не так?