aws graphql @connection не возвращает массив, как ожидалось?
У меня есть модель graphql следующим образом (у пользователя может быть много сообщений 1:m)
type User @model {
id: ID!
fullName: String!
emailAddress: String!
posts: [Post] @connection(name: "UserPostConnection")
}
type Post @model {
id: ID!
text: String!
user: User @connection(name: "UserPostConnection")
createdAt: String
updatedAt: String
}
Я пытаюсь вернуть все сообщения для конкретного пользователя, вот так:
let queryInput = GetUserQuery(id: "879db4f2-1dad-47b9-b70d-8bca15bf2549")
appSyncClient?.fetch(query: queryInput, cachePolicy: .fetchIgnoringCacheData) { (result, error) in
print(result?.data?.getUser?.posts)
}
}
Однако результат не возвращает массив, он возвращает необязательный параметр:
Optional(AWSStackSocial.GetUserQuery.Data.GetUser.Post(snapshot: ["__typename": Optional("ModelPostConnection"), "nextToken": nil]))
Я подтвердил, что а) пользователь существует; б) сообщения также существуют.
В AWS:
query {
getUser(id: "879db4f2-1dad-47b9-b70d-8bca15bf2549") {
id
posts {
items {
id
}
}
}
}
Выход:
{
"data": {
"getUser": {
"id": "879db4f2-1dad-47b9-b70d-8bca15bf2549",
"posts": {
"items": [
{
"id": "04c4b571-6e92-4745-9a40-1a67a9d49d77"
},
{
"id": "0f44fe6e-4e15-4a8c-b591-555e8fa1f60e"
},
{
"id": "60c18c40-fea3-4ff3-8b21-df6857703dd2"
}
]
}
}
}
}
2 ответа
Я нашел ответ. Уровень глубины по умолчанию для усиления GraphQL равен 2, поэтому его нужно было изменить на 3. Это можно сделать, изменив максимальную глубину:
amplify codegen configure
Все, что есть в вашей модели, не имеет необходимого суффикса (!
) по определению является необязательным, независимо от того, существует он или нет. Вы должны остерегаться этогоnil
потому что он определен так, что может бытьnil
. Если вы являетесь владельцем модели, вы можете изменить те, которые потребуются (я не предлагаю этого!). В противном случае вам просто придется разворачивать вещи, когда вы их обрабатываете.
guard let user = result?.data?.getUser, let posts = user.posts else { throw NoPostsError }