Второй параметр в обработчике экспресс-маршрута

avatar
klondike
1 июля 2021 в 21:02
62
2
0

Я сталкиваюсь с кодом, в котором помимо пути и обратного вызова есть дополнительный параметр для экспресс-обработчиков маршрутов.

Например:

app.get('/path', authUser, (req,res) => {
...
}

где authUser — это функция. Кто-нибудь может объяснить роль таких функций? На сегодняшний день я видел только экспресс-маршруты с двумя параметрами.

Источник

Ответы (2)

avatar
jfriend00
1 июля 2021 в 21:56
0

Семейство методов, таких как app.get(), app.post(), app.use(), принимает любое количество обработчиков запросов в качестве последовательных аргументов:

app.get('/path', fn1, fn2, fn3, fn4);

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

В вашем конкретном случае:

app.get('/path', authUser, (req,res) => {
...
}

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


Но я хочу подчеркнуть, что это общий механизм, который не ограничивается только тем, что классически называют промежуточным программным обеспечением. Его также можно использовать для обработчиков запросов, которые могут выполняться условно на основе других параметров. Например, вот один такой пример, когда первый обработчик запроса просматривает URL-адрес и решает сам обработать весь запрос на основе того, что он видит в URL-адресе, и, если нет, передает его следующему обработчику:

app.get('/book/:id', (req, res) => {
    // check if id is purely numeric
    if (/^\d+$/.test(req.params.id)) {
        // this is a request for a book by numeric id
        // look up the book numeric id in the database and return the meta
        // data about this book
    } else {
        // not a book id, let next request handler have the request
        next();
     }
}, (req, res) => {
    // must be a book title lookup
    // look up the book in the title database and return the id
});
avatar
plusheen
1 июля 2021 в 21:06
2

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

Таким образом, это, вероятно, промежуточное ПО, которое проверяет запрос для аутентифицированного пользователя и возвращает 401/403, если он не аутентифицирован, что означает, что вы можете написать свой обработчик маршрута, предполагая, что вы аутентифицированы.

Для получения дополнительной информации ознакомьтесь с этой статьей