Как использовать express-async-handler - PullRequest
0 голосов
/ 31 октября 2018

Я делаю код на github: https://github.com/linnovate/mean/blob/master/server/routes/user.route.js

Но есть часть, которую я не понимаю, а именно:

router.route('/')
    .post(asyncHandler(insert));

В npm Экспресс-асинхронный обработчик описывается как:

Простое промежуточное ПО для обработки исключений внутри асинхронных экспресс-маршрутов и передачи их в экспресс-обработчики ошибок.

Они приводят пример использования модуля, но он мало что объясняет.

Итак, мои вопросы:

  1. Как вызывается функция вставки в строке 12 без скобок?

  2. Какова функция asyncHandler (), как будет выглядеть код, если вы решите не использовать его?

  3. Обычно при использовании router.route ('/'). Post существуют фигурные скобки, которые следуют. В этом коде я не вижу ничего. Поэтому мой вопрос: является ли вставка асинхронной функции частью тела функции router.route ('/'). Post ? и если нет, то почему нет фигурных скобок?

  4. Что именно здесь экспортируется user.controller.js в строке 14 (это объект, переменная ...)? В чем преимущество экспорта таким образом? Почему бы просто не экспортировать функцию insert ()?

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

1 Ответ

0 голосов
/ 31 октября 2018

Как функция вставки в строке 12 вызывается без скобок?

Функция insert здесь не вызывается. Он передается в asyncHandler() как ссылка на функцию, поэтому ее можно вызвать позже. Это asyncHandler(), который вызывается немедленно и возвращает новую функцию, которая передается в .post() в качестве обработчика запроса.

Какова функция asyncHandler (), как будет выглядеть код, если вы решите не использовать его?

Это обертка вокруг insert, которая ищет отклоненное обещание, возвращенное функцией, и, если найден, автоматически вызывает next(err).

Обычно при использовании router.route ('/'). Post есть фигурные скобки, которые следуют. В этом коде я не вижу ничего. Итак, мой вопрос: является ли функция асинхронной вставки частью тела функции router.route ('/'). Post? а если нет, то почему нет фигурных скобок?

Я не уверен, что вы подразумеваете под фигурными скобками. .post() ожидает, что ему будет передана ссылка на функцию, которая будет вызываться с определенным набором параметров, когда указанный маршрут соответствует входящему запросу. Может использоваться как одно из следующих:

// externally defined request handler function
router.route('/').post(someRequestHandlerFunc);

// inline defined request handler function
router.route('/').post(function(req, res, next) {
    // code here for the request handler
});

Что именно экспортируется сюда user.controller.js в строке 14 (это объект, переменная ...)? В чем преимущество экспорта таким образом? Почему бы просто не экспортировать функцию insert ()?

Я предполагаю строку 14, о которой вы спрашиваете: здесь . Это просто экспорт функции insert в свойство insert экспорта этих модулей. При экспорте функции вы не используете insert(). Это вызывает функцию немедленно. Вы просто ссылаетесь на имя функции как insert, чтобы экспортировать ссылку на функцию, которую можно вызвать позже.

Причиной экспорта является свойство объекта, а не просто экспорт отдельной функции, чтобы сделать модуль расширяемым, чтобы он мог экспортировать другие объекты в виде различных именованных свойств.

...