Как использовать экспресс-асинхронный обработчик

Я просматриваю код на github: https://github.com/linnovate/mean/blob/master/server/routes/user.route.js

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

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

В npm express-async-обработчик описывается как:

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

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

Поэтому мои вопросы:

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

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

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

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

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

Всего 1 ответ


Как функция вставки в строке 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 (это объект, var ...)? В чем преимущество экспорта таким образом? Почему бы просто не экспортировать функцию insert ()?

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

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


Есть идеи?

10000