Как работает промежуточное ПО в Express?

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Статья переведена. Ссылка на оригинал

Эта статья представляет собой адаптированный отрывок из книги "Express API Validation Essentials". Она научит вас полноценной стратегии валидации API, которую вы можете начать применять в своих Express-приложениях уже сегодня.

__________________

Документация Express говорит нам, что "приложение Express - это, по сути, серия вызовов функций промежуточного ПО". На первый взгляд это звучит просто, но, честно говоря, промежуточное ПО может быть весьма запутанным. Вы, вероятно, задавались вопросом:

  • Где правильное место для добавления этого промежуточного ПО в мое приложение?

  • Когда я должен вызвать функцию обратного вызова next, и что произойдет, когда я это сделаю?

  • Почему важен порядок использования промежуточного ПО?

  • Как я могу написать свой собственный код для обработки ошибок?

Паттерн промежуточного ПО является основополагающим при создании приложений на Express, поэтому вам необходимо хорошо понимать, что такое промежуточное ПО и как оно работает.

В этой статье мы подробно рассмотрим паттерн промежуточного ПО. Мы также рассмотрим различные типы промежуточного ПО Express и то, как эффективно сочетать их при создании приложений.

Шаблон промежуточного ПО

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

Когда вы определяете маршрут в Express, функция-обработчик маршрута, которую вы указываете для этого маршрута, является функцией промежуточного ПО:

app.get("/user", function routeHandlerMiddleware(request, response, next) {
    // execute something
});

(Пример 1.1)

Промежуточное ПО достаточно гибкое. Вы можете указать Express запускать одну и ту же функцию промежуточного ПО для различных маршрутов, что позволит вам делать такие вещи, как общая проверка для разных конечных точек API.

Помимо написания собственных функций промежуточного ПО, вы также можете установить стороннее промежуточное ПО для использования в вашем приложении. В документации Express перечислены некоторые популярные модули промежуточного ПО. На npm также доступен широкий спектр модулей промежуточного ПО Express.

Синтаксис промежуточного ПО

Вот синтаксис функции промежуточного ПО:

/**
 * @param {Object} request - Express request object (commonly named `req`)
 * @param {Object} response - Express response object (commonly named `res`)
 * @param {Function} next - Express `next()` function
 */
function middlewareFunction(request, response, next) {
    // execute something
}

(Пример 1.2)

Примечание: Вы могли заметить, что я называю req как request, а res как response. Вы можете называть параметры своих промежуточных функций как угодно, но я предпочитаю использовать более четкие имена переменных, поскольку считаю, что так другим разработчикам легче понять, что делает ваш код, даже если они не знакомы с фреймворком Express.

Когда Express запускает функцию промежуточного ПО, ей передаются три аргумента:

  • Объект запроса Express (обычно называемый req) - это расширенный экземпляр встроенного в Node.js класса http.IncomingMessage.

  • Объект ответа Express (обычно называемый res) - это расширенный экземпляр встроенного в Node.js класса http.ServerResponse.

  • Функция Express next() - После того как промежуточная функция выполнит свои задачи, она должна вызвать функцию next(), чтобы передать управление следующей промежуточной программе. Если вы передаете ей аргумент, Express принимает его за ошибку. Он пропустит все оставшиеся функции промежуточного ПО, не обрабатывающие ошибки, и начнет выполнять промежуточное ПО, которое обрабатывает ошибки.

  • Функции промежуточного ПО не должны иметь значение return. Любое значение, возвращаемое промежуточным ПО, не будет использовано Express.

Два типа промежуточного ПО

Обычное промежуточное ПО

Большинство функций промежуточного ПО, с которыми вы будете работать в приложении Express, являются тем, что я называю "простым" промежуточным ПО (в документации Express нет специального термина для них). Они выглядят как функция, определенная в приведенном выше примере синтаксиса промежуточного ПО (пример 1.2).

Вот пример простой функции промежуточного ПО:

function plainMiddlewareFunction(request, response, next) {
    console.log(`The request method is ${request.method}`);

    /**
     * Ensure the next middleware function is called.
     */
    next();
}

(Пример 1.3)

Промежуточное ПО для обработки ошибок

  • Разница между промежуточным ПО для обработки ошибок и обычным промежуточным ПО заключается в том, что функции промежуточного ПО для обработки ошибок задают четыре параметра вместо трех, т.е. (error, request, response, next).

Вот пример функции промежуточного ПО для обработки ошибок:

function errorHandlingMiddlewareFunction(error, request, response, next) {
    console.log(error.message);

    /**
     * Ensure the next error handling middleware is called.
     */
    next(error);
}

(Пример 1.4)

Эта промежуточная функция обработки ошибок будет выполнена, когда другая промежуточная функция вызовет функцию next() с объектом ошибки, например.

function anotherMiddlewareFunction(request, response, next) {
    const error = new Error("Something is wrong");

    /**
     * This will cause Express to start executing error
     * handling middleware.
     */
    next(error);
}

(Пример 1.5)

Использование промежуточного ПО

Порядок настройки промежуточного ПО очень важен. Вы можете применить их на трех различных уровнях в вашем приложении:

  • Уровень маршрута

  • Уровень маршрутизатора

  • Уровень приложения

Если вы хотите, чтобы маршрут (или маршруты) обрабатывал ошибки, которые он вызывает, с помощью промежуточного ПО для обработки ошибок, вы должны добавить его после определения маршрута.

Давайте рассмотрим, как выглядит настройка промежуточного ПО на каждом уровне.

На уровне маршрута

Это самый конкретный уровень: любое промежуточное ПО, которое вы настроите на уровне маршрута, будет работать только для этого определенного маршрута.

app.get("/", someMiddleware, routeHandlerMiddleware, errorHandlerMiddleware);

(Пример 1.6)

На уровне маршрутизатора

Express позволяет создавать объекты Router. Они позволяют вам ограничить использование промежуточного ПО определенным набором маршрутов. Если вы хотите, чтобы одно и то же промежуточное ПО выполнялось для нескольких маршрутов, а не для всех, то такие объекты могут быть очень полезны.

import express from "express";

const router = express.Router();

router.use(someMiddleware);

router.post("/user", createUserRouteHandler);
router.get("/user/:user_id", getUserRouteHandler);
router.put("/user/:user_id", updateUserRouteHandler);
router.delete("/user/:user_id", deleteUserRouteHandler);

router.use(errorHandlerMiddleware);

(Пример 1.7)

На уровне приложения

Это наименее специфический уровень. Любое промежуточное ПО, настроенное на этом уровне, будет запущено для всех маршрутов.

app.use(someMiddleware);

// define routes

app.use(errorHandlerMiddleware);

(Пример 1.8)

Технически вы можете определить несколько маршрутов, вызвать app.use(someMiddleware), затем определить несколько других маршрутов, для которых вы хотите запустить someMiddleware. Я не рекомендую такой подход, поскольку он приводит к запутанной и трудноотлаживаемой структуре приложения.

Вы должны настраивать промежуточное ПО на уровне приложения только в случае крайней необходимости, а именно, если его действительно нужно запускать для каждого маршрута в вашем приложении. Каждая функция промежуточного ПО, независимо от того, насколько она мала, требует определенного времени для выполнения. Чем больше функций промежуточного ПО необходимо запустить для маршрута, тем медленнее будут выполняться запросы к этому маршруту. Это действительно увеличивается по мере роста вашего приложения и конфигурации с большим количеством промежуточного ПО. Старайтесь по возможности ограничивать промежуточное ПО уровнями маршрута или маршрутизатора.

Подведение итогов

В этой статье мы узнали о шаблоне промежуточного ПО в Express. Мы также узнали о различных типах промежуточного ПО и о том, как их можно комбинировать при создании приложения на Express.

Если вы хотите прочитать больше о промежуточном ПО, в документации Express есть несколько руководств:

  • Руководство: Использование промежуточного ПО

  • Руководство: Написание промежуточного ПО для использования в приложениях Express

__________________

Эта статья представляет собой адаптированный отрывок из книги "Express API Validation Essentials". Она научит вас полной стратегии валидации API, которую вы можете начать применять в своих Express-приложениях уже сегодня.

__________________

Все коды на изображениях для копирования доступны здесь.

Статья переведена в преддверии старта курса "Node.js Developer". Всех, кто желает подробнее узнать о курсе и процессе обучения, приглашаем записаться на Demo Day курса, который пройдет 28 июня.

- ЗАПИСАТЬСЯ НА DEMO DAY КУРСА

Статья переведена. Ссылка на оригинал

Источник: https://habr.com/ru/company/otus/blog/562914/


Интересные статьи

Интересные статьи

В этой статье мы расскажем, как оптимизировать крупный проект в «Битрикс24» и увеличить его производительность в 3 раза, изменяя настройки MySQL и режим питания CPU. Дано Корпоративн...
Training Within Industry (TWI) позволяет снизить количество управленческих ошибок, наладить взаимопонимание и повысить уровень компетенций специалистов без отрыва от прои...
Часть 1 Часть 2 Часть 3 В этой статье вы узнаете: -О том, что такое transfer learning и как это работает -О том, что такое semantic/instance segmentation и как это работает ...
Вдохновили статьи о работе в различных в основном айтишных компаниях. В то же время космический хайп смещается на Маска. Уже и забыли про проект «Маяк», фотографирование следов посадок на Луне и ...
Эта публикация написана после неоднократных обращений как клиентов, так и (к горести моей) партнеров. Темы обращений были разные, но причиной в итоге оказывался один и тот же сценарий, реализу...