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

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

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

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

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

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

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

2 ответа

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

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

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

Проверьте это: 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'
    }
  });
}
Другие вопросы по тегам