Просматривая Stackoverflow, наблюдая за моими тегами, я заметил, что большинство новичков борются с шаблоном промежуточного программного обеспечения и с тем, как применить его к своему приложению, хотя они использовали его раньше с bodyparser и/ или другие инструменты.

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

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

Промежуточное программное обеспечение — это просто функция, которую можно применить к другой функции, которая выполняет функцию промежуточного программного обеспечения со своими собственными параметрами и передает ее результат себе. Легко, верно? Итак, давайте определим нашу промежуточную функцию:

const authenticate = (req, res, next) => {
    // parse the user - or anything else - 
    // out of the request body.
    let user = req.body.user
    // do some checking
    if (user === database.user) {
        // user successfully authenticated -> call next, which  
        // terminates the middleware-function and the parent
        // continues.
        next()
     )
     // user didn't match any we know? Respond with authentication
     // failure.
     res.status(401);
}

Очень просто. Теперь мы можем применить это промежуточное ПО к каждому маршруту нашего бэкенда. Поскольку мы работаем с объектами req и res, нет смысла применять его к другим функциям.

Теперь нам нужно решить, применять ли его ко всем нашим маршрутам или только к некоторым определенным.

// apply it to all routes
app.use(authenticate)
// apply it to a certain route
app.get('/sensibledata', authenticate, (req, res) => {
    // only authenticated user will have access to the
    // following code - everyone else received a status 
    // 401 to their request.
    res.send({ data: sensibleData })
}

Сделанный.