Как я могу сообщить об ошибке в преобразователе мутаций apollo-server graphql?

В документации говорится, что преобразователь имеет следующую форму:

fieldName: (obj, args, context, info) => result

И этот результат будет null или undefined, если «объект не может быть найден».

А как насчет других ошибок - например, если доступ не авторизован?

Похоже, что вы не можете напрямую «вернуть» ошибку, потому что результат должен соответствовать схеме.

Я пробовал генерировать исключение в преобразователе, и это почти правильно: клиент получает ApolloError с сообщением об исключении: это здорово. НО apollo-server выдает трассировку стека, как если бы исключение не было обработано. Это не кажется правильным.

Отсюда вопрос: как это сделать?


Трассировка стека apollo-server, если это помогает:

Error: test exception message
at /Users/mgregory/NRN/src/agreeonit/apollo_server/resolvers/mutationResolvers.js:29:17
at tryCatcher (/Users/mgregory/NRN/src/agreeonit/apollo_server/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/Users/mgregory/NRN/src/agreeonit/apollo_server/node_modules/bluebird/js/release/promise.js:510:31)
at Promise._settlePromise (/Users/mgregory/NRN/src/agreeonit/apollo_server/node_modules/bluebird/js/release/promise.js:567:18)
at Promise._settlePromise0 (/Users/mgregory/NRN/src/agreeonit/apollo_server/node_modules/bluebird/js/release/promise.js:612:10)
at Promise._settlePromises (/Users/mgregory/NRN/src/agreeonit/apollo_server/node_modules/bluebird/js/release/promise.js:691:18)
at Async._drainQueue (/Users/mgregory/NRN/src/agreeonit/apollo_server/node_modules/bluebird/js/release/async.js:138:16)
at Async._drainQueues (/Users/mgregory/NRN/src/agreeonit/apollo_server/node_modules/bluebird/js/release/async.js:148:10)
at Immediate.Async.drainQueues (/Users/mgregory/NRN/src/agreeonit/apollo_server/node_modules/bluebird/js/release/async.js:17:14)
at runCallback (timers.js:574:20)
at tryOnImmediate (timers.js:554:5)
at processImmediate [as _immediateCallback] (timers.js:533:5)

person GreenAsJade    schedule 27.02.2017    source источник


Ответы (1)


Я обнаружил, что трассировка стека выдается, потому что значение по умолчанию GraphQLOptions.debug - true.

Установка этого значения в false при инициализации сервера очищает все.

Вывод: правильный способ сделать это - выбросить исключение.

person GreenAsJade    schedule 27.02.2017