Запросы Graphql, сгенерированные функцией ampify, работают хорошо, но выдают ошибки из-за правил аутентификации.Зачем? - PullRequest
0 голосов
/ 28 февраля 2019

Резюме: я использую javascript, сгенерированный aws-ampify, для отправки запросов и мутаций в конечную точку graphs AWS с бэкэндом dynamicodb.Запросы / мутации функционируют достаточно хорошо (они создают, получают и удаляют записи по назначению).Но они постоянно выдают ошибку в процессе:

"Условие запроса пропущено. Элемент схемы ключа: authorId (Сервис: AmazonDynamoDBv2; Код состояния: 400; Код ошибки: ValidationException;"

Мой код можетне слишком ли плохо, иначе почему он так хорошо работает? Тем не менее, я хотел бы избавиться от этой надоедливой ошибки или хотя бы понять ее. Почему происходит эта ошибка?


Подробности:

Мой API генерируется из точного файла schema.graphql, предоставленного в примере aws-aws-appsync-chat https://github.com/aws-samples/aws-appsync-chat

Соответствующая часть модели находится здесь ...

type User 
  @model 
  @auth(rules: [{ allow: owner, ownerField: "id", queries: null }]) {
  id: ID!
  username: String!
  conversations: [ConvoLink] @connection(name: "UserLinks")
  messages: [Message] @connection(name: "UserMessages")
    createdAt: String
    updatedAt: String
}

К сожалению, этот пример на самом деле не использует запросы и мутации, сгенерированные при помощи ampify. Вместо этого он использует рукописную схему в файле: src / graphql.js. Это верно. Сгенерированные запросы / мутациивключены в проект, но на самом деле не используются. Это было очень обидно для меня. Но моя вера была восстановлена ​​(несколько), когда мне удалось переписать логику javascript, чтобы она функционировала (больше или меньше).ess) использование запросов и мутаций, которые были сгенерированы при помощи ampify.

В любом случае, первый шаг, который я предпринял, - это написать логику для (1) запроса таблицы пользователей, чтобы увидеть, существует ли запись для текущего авторизованного пользователя.и (2) создание записи, если авторизованного пользователя там нет.Для получения бонусных баллов я также написал логику для (3) удаления записи пользователя из базы данных.

Работая внутри компонента vuejs, я написал эти методы ...

methods: {
    async DeleteUserRecord() {
        try {
            let id = store.state.user.username;
            const input = { id: id };
            await API.graphql(graphqlOperation(deleteUser, { input }));// works but throws errors
        } catch (err) {
            console.log('Error deleting user record:', err)
        }
    },
    async GetUserRecord() {
        try {
            let id = store.state.user.username;
            const result = await API.graphql(graphqlOperation(getUser, { id }));// works but throws errors
            console.log(result);
        } catch (err) {
            console.log('Error getting user record:', err)
        }
    },
    async CreateUserRecord() {
        let username = store.state.user.username;
        try {
            const result = await API.graphql(graphqlOperation(createUser, { input:{ id:username, username: username } })) // works but throws error
            console.log(result);
        } catch (err) {
            console.log('Error creating user record:', err)
        }
    }
  }

Все трикажется, работает, но они выдают ошибки, см. прикрепленный скриншот для деталей.

Console errors screenshot

Всегда одна и та же ошибка: "Условие запроса пропущено ключевой элемент схемы: authorId (Сервис: AmazonDynamoDBv2; Код состояния: 400; Код ошибки: ValidationException;"

Ошибка должна быть связана с правилами аутентификации в модели. Но помните, что мой код работает, поэтому мой код не полная чушь.

Может кто-нибудь объяснить мне эту ошибку?Это ошибка в AWS? Или мой код написан неправильно?

---------------------------------- ОБНОВЛЕНИЕ НИЖЕ -------------------------------

Я до сих пор не понимаю, почему этоошибка возникает, но я добился некоторого прогресса в ее понимании.

  1. Как показано на скриншотах, запрос getUser, генерируемый ampify, сработает, если я удалю часть, которая запрашивает сообщения пользователя.

  2. AuthorId, который появляется в сообщении об ошибке, должен исходить из модели данных объектов Message.

  3. Обратите внимание, что используется схема graphqlamed соединение, чтобы связать сообщения с пользователем, с ключевым полем «authorId».

Итак, я мог бы, вероятно, избавиться от ошибки, поигравшись со спецификацией соединения в модели данных.

Но подождите.Это запросы по умолчанию, сгенерированные при помощи ampify, просто предоставив ему схему, полученную ТОЧНО из проекта aws-sample.Разве эти запросы не могут работать достаточно хорошо без моего редактирования?

Garphql Schema Working Query Failing Query

1 Ответ

0 голосов
/ 04 мая 2019

У меня та же проблема, что и у вас.

Я нашел рабочий пример в github https://github.com/aws-amplify/amplify-cli/pull/1358

type Post @model {
  id: ID!
  name: String!
  comments: [Comment] @connection(name: "PostComments", keyField: "postId", sortField: "statusDate")
}

type Comment @model(queries: null) {
  id: ID!
  post: Post! @connection(name: "PostComments", keyField: "postId", sortField: "statusDate")
  postId: ID!
  statusDate: String!
}

KeyField ДОЛЖЕН быть одинаковым на обоих концах @атрибут подключения.В учебном примере github отсутствующей частью является «authorId» из типа User:

type User
  @model
  @auth(rules: [{ allow: owner, ownerField: "id", queries: null }]) {
  id: ID!
  username: String!
  conversations: [ConvoLink] @connection(name: "UserLinks")
  messages: [Message] @connection(name: "UserMessages", keyField: "authorId")
  createdAt: String
  updatedAt: String
}

Более того, было бы лучше сделать authorId как ненулевое значение в типе сообщения, потому что сообщение не можетбыть опубликованным без автора.

type Message @model @auth(rules: [{ allow: owner, ownerField: "authorId" }]) {
  id: ID!
  author: User @connection(name: "UserMessages", keyField: "authorId")
  authorId: String!
  content: String!
  conversation: Conversation! @connection(name: "ConvoMsgs")
  messageConversationId: ID!
  createdAt: String
  updatedAt: String
}
...