Обработка ошибок с помощью express-graphql & реагировать-apollo

Я пытаюсь отобразить простую ошибку "Электронная почта и пароль не совпадают" в форме входа в систему, но у меня возникли проблемы, и я не уверен, находится ли ошибка на сервере или в приложении React. Я думал, что отправлю здесь, так как я не уверен, какой репозиторий GitHub будет уместным. Вот решатель на сервере:

// Schema definition:

type Mutation {
   loginViewer(credentials: AUTH_CREDENTIALS): SignInPayload!
}

type SignInPayload {
   token: String
   expires: Int
   requiresReset: Boolean
}

// Mapping the mutation to the resolver:

Mutation: {
   loginViewer: loginViewerMutation,
},


// Resolver:

const loginViewerMutation = async (obj, args) => {
   const { credentials } = args
   const user = await User.findOne({ email })
   if (!user) throw new GraphQLError('Email and password do not match')
   const matches = await user.comparePassword(password)
   if (!matches) throw new GraphQLError('Email and password do not match')
   return createJWT(user)
}

Затем мутация, как она называется внутри моего компонента Login:

const mutation = gql`
   mutation LoginViewer($password: String!, $email: String!) {
      loginViewer(credentials: { email: $email, password: $password }) {
         token
         expires
         requiresReset
      }
   }
`

export class Login extends React.Component {
   handleLogin = (credentials) => {
      this.props
         .mutate({ variables: { ...credentials } })
         .then(() => {
            // ...
         })
         .catch((error) => {
            console.log(error.message)
            console.log(error.graphQLErrors)
            // ...
         })
   }

   render() {
      // ...
   }
}

export default graqphql(mutation)(Login)

Все работает как положено, когда я предоставляю правильную информацию. Когда я не делаю, ошибка, которая поймана, не содержит GraphQLErrors.

Я использую промежуточное программное обеспечение apollo-link-error со стандартными настройками: https://www.apollographql.com/docs/link/links/error.html

Моя консоль выглядит так:

Ожидаемая ошибка аутентификации возвращается и регистрируется из промежуточного программного обеспечения. Но в моем компоненте Login массив error.graphQLErrors пуст.

Где я могу пойти не так?

  • Неправильно возвращать 500 внутренних ошибок сервера - он ведет себя именно так, как я хочу. Я неправильно это реализую на сервере?

  • Как графические ошибки теряются между промежуточным программным обеспечением регистрации и.catch(ошибка)?

1 ответ

Я задал этот вопрос в репозитории express-graphql github, они быстро указали, что решение - удалить ! на моем loginViewer мутация:

// Schema definition:

type Mutation {
   loginViewer(credentials: AUTH_CREDENTIALS): SignInPayload!
}

// Should be:

type Mutation {
   loginViewer(credentials: AUTH_CREDENTIALS): SignInPayload
}

Это ожидаемое поведение, поскольку ваше поле верхнего уровня (loginViewer) определено как ненулевое. Это означает, что при появлении ошибки в движке GraphQL нет никакой опции, кроме как сделать поле данных равным нулю:

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

Если все поля от корня запроса до источника ошибки возвращают ненулевые типы, то запись "данные" в ответе должна быть нулевой.

http://facebook.github.io/graphql/draft/

Если данные нулевые, это означает, что весь запрос не выполнен, и ответ express-graphql равен 500.

Другие вопросы по тегам