Лучший способ обработки смешанных синхронных и асинхронных ошибок в ExpressJS - PullRequest
0 голосов
/ 29 ноября 2018

Использование NodeJS 10.13.0, ExpressJS 4.16.4 ... Получил контроллер, обрабатывающий маршрут, который выглядит следующим образом:

import { Request, Response, NextFunction } from 'express';
import braintree from 'braintree';
import config from '../../server.config';

export function index(req: Request, res: Response, next: NextFunction): void {
  if(!config.braintree) throw new Error('Braintree configuration missing.');
  const gateway: any = braintree.connect(config.braintree); // synchronous
  return gateway.clientToken.generate({})
    .then(response => res.send(response.clientToken))
    .catch(next) // operational error unless config.braintree was changed
}

Чтение документов ExpressJS по обработке ошибок ,Мне интересно, следую ли я наилучшим методам - ​​выбрасывая Error для синхронной части и передавая ошибку в next () в catch для асинхронной части.

Любые рекомендации по улучшению?

1 Ответ

0 голосов
/ 29 ноября 2018

Учитывая, что используются обещания, синхронные и асинхронные ошибки можно последовательно обрабатывать с помощью функции async:

export async function index(req: Request, res: Response, next: NextFunction) {
  try {
    if(!config.braintree)
      throw new Error('Braintree configuration missing.');

    const gateway: any = braintree.connect(config.braintree);
    const response = await gateway.clientToken.generate({})
    res.send(response.clientToken);
  } catch (err) {
    next(err);
  }
}

Поскольку Express не поддерживает обещания, тело функции async должно быть перенесенос try..catch.Учитывая, что try..catch является общим для всех async функций промежуточного программного обеспечения, его можно переместить в помощник:

const asyncMiddleware = (middleware: RequestHandler) => async (req: Request, res: Response, next: NextFunction) => {
  try {
    await middleware(req, res, next);
  } catch (err) {
    next(err)
  }
};

, который используется как:

export const index = asyncMiddleware(async (...) => {...});
...