Я работаю с открытым исходным кодом, в котором я реализовал обработку ошибок для всех возможных сценариев (ошибки разработчика / эксплуатации)
Например, ошибки асинхронной обработки / ожидания обрабатываются с помощью оболочки:
const asyncMiddleware = fn => (req, res, next) =>
Promise.resolve(fn(req, res, next)).catch(err => {
if (!err.isBoom) return next(boom.badImplementation(err));
next(err);
});
Внутренние ошибки передаются в next
Более подробная информация о том, как я реализовал обработку ошибок, доступна здесь
Теперь, когда я добавил GraphQl с ApolloServer и Prisma, я могу использовать async
мутации.Однако, что я заметил, так это то, что если обернуть асинхронную функцию описанной выше оболочкой asyncMiddleware
и выдать ошибку из await
, площадка GraphQl покажет ошибку типа, а не фактическую ошибку.Я хочу, чтобы в таких случаях происходил сбой сервера, однако этого не происходит, поскольку ошибки просто не доходят до моего пользовательского обработчика ошибок, где я проверяю, есть ли ошибка isDeveloper
, и выхожу из процесса.Чтобы передать ошибки в пользовательский обработчик ошибок, мне нужно иметь доступ к функции next
.
Я пытался передать next
в контекст при инициализации ApolloServer:
context: (req, res, next )
, но, похоже, это не работает.По крайней мере, передавая ошибки в context.next(err)
Я по-прежнему получаю сообщение об ошибке типа в GraphQl Playground, и сервер не падает.