Обработка ошибок Apollo GraphQL

Я использую apollographql / graphql-server. Ответы сервера выглядят так:

{"data":{...},"errors":[{"message":"...","locations":...}]}

У меня два вопроса:

  1. Я обнаружил, что могу выбросить или вернуть объект Error, и он будет помещен в массив ошибок ответа, но ответ будет отправлен, как только я это сделаю. Как я могу вернуть более одной ошибки?

  2. Предполагается ли, что массив ошибок предназначен только для ошибок приложения или сервера, например для ошибок? Следует ли размещать ошибки проверки и проверки данных внутри объекта данных?

Заранее спасибо!


person James    schedule 06.02.2017    source источник


Ответы (2)


  1. Если вам нужно вернуть более одной ошибки для ответа, вам, скорее всего, потребуется самостоятельно создать массив ошибок, а затем, когда вы будете готовы, вернуть ошибки graphql. Я делаю нечто подобное в своем коде. Хотя в большинстве случаев, если я получаю сообщение об ошибке, я все равно хочу остановить его и вернуть проблему клиенту.

  2. Все, что выходит за рамки типичного «счастливого пути» для ваших ошибок graphql, вы захотите вернуть. Ваш клиентский код будет полагаться на эти данные, поэтому вы хотите, чтобы ваш клиент мог реагировать на неожиданные проблемы, возникающие на сервере. Разрешенные или пустые наборы результатов - единственное, что возвращается как обычно и не вызывает ошибок. Что-нибудь еще, отсутствующие параметры, ошибки базы данных и т. Д., Вы захотите вернуть ошибку.

Надеюсь, это поможет! :)

person Justin    schedule 15.02.2017
comment
Спасибо за Ваш ответ. 1) Раньше я пытался выбросить или вернуть массив ошибок или ошибку с массивом строк, но безуспешно. Вы знаете, как это сделать? 2) В обычном режиме я помещаю ошибки, обнаруженные в объекте данных, вместо этого, поскольку массив ошибок из ответа сервера кажется не подходящим для ошибок, таких как проверка формы. - person James; 21.02.2017
comment
Привет, Джеймс, я вижу то же самое и пытаюсь разобраться в этом, я не могу понять, как выдать более одной ошибки, поэтому мои ошибки, возвращающиеся в виде массива, кажутся немного бессмысленными .... ты когда нибудь найду ответ ??? - person Samuel; 28.02.2019

Проверьте это: https://github.com/thebigredgeek/apollo-errors

Из их ReadMe:

Создайте несколько ошибок:

import { createError } from 'apollo-errors';

export const FooError = createError('FooError', {
  message: 'A foo error has occurred'
});

Подключите форматирование:

import express from 'express';
import bodyParser from 'body-parser';
import { formatError } from 'apollo-errors';
import { graphqlExpress } from 'apollo-server-express';
import schema from './schema';

const app = express();

app.use('/graphql',
  bodyParser.json(),
  graphqlExpress({
    formatError,
    schema
  })
);

app.listen(8080)

Выкинь какие-нибудь ошибки:

import { FooError } from './errors';

const resolverThatThrowsError = (root, params, context) => {
  throw new FooError({
    data: {
      something: 'important'
    }
  });
}
person Vlady Veselinov    schedule 11.10.2017