Использование промежуточного ПО Express.JS только на некоторых маршрутах

В качестве упражнения по изучению NodeJS я создаю своего рода API с ExpressJS, который отвечает на веб-запросы. На данный момент в программе есть три маршрута: «/ login», «/ register» и «/ changePassword». Все эти методы не нуждаются в каких-либо токенах для обработки.

Однако любой другой маршрут, который я планирую добавить в программу (например, маршрут «/ post»), потребует от пользователя аутентификации с помощью токена, полученного из запроса POST, в «/ login» с правильными учетными данными.

Чтобы проверить токен, я написал функцию промежуточного программного обеспечения:

module.exports.validateToken = function (req,res,next) {
    const token = req.headers['x-access-token']
    console.info(`validateToken() - TOKEN: ${token}`)
    if (token) {
        //Make sure the token is valid[...]
        next()
    }else {
        return res.status(401).send({
            message: 'Missing token',
            success: false
        })
    } 
}

У меня вопрос: как применить это промежуточное ПО только к маршрутам, требующим аутентификации? Я подумал о том, чтобы просто создать еще один объект Router и назвать его так:

const tokenValidator = require('./util').validate.validateToken
// Router used for any actions that require user-authentication
const authRouter = new app.Router()
authRouter.use(tokenValidator)

Но будет ли это вообще мешать моим исходным маршрутам без аутентификации?

// Initiate the routes that don't need auth
const routes = require('./routes')(app)

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
11
0
6 490
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Допустим, ваше промежуточное ПО находится в "./middleware/auth"

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

app.use("/private", require("./middleware/auth"));

Это вызовет ваше промежуточное программное обеспечение аутентификации на любом маршруте, который начинается с '/ private'

Таким образом, любой контроллер API, требующий аутентификации, должен быть определен как:

app.use("/private/foo", require("./controllers/foo"));

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

И все, что не требует вашего промежуточного программного обеспечения, должно просто оставаться за пределами `` частного '' контекста api, например

app.use("/", require("./controllers/somecontroller"));

Это сработало отлично, мне вообще не пришлось создавать второй маршрутизатор. Ваше здоровье!

user9173577 26.10.2018 16:37

Нет проблем, хомбре!

Lee Brindley 26.10.2018 16:37

В Expressjs каждое добавляемое промежуточное ПО добавляется в стек промежуточного программного обеспечения, то есть в FIFO.

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

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use(<<pattern>>, authenticate)

Кроме того, вы можете попробовать использовать модуль nodejs базовая авторизация для аутентификации.

Надеюсь это поможет!

Предпочитаю, чтобы вещи были как можно более ванильными! Одна из моих самых больших претензий к nodejs / javascript заключается в том, что каждая проблема, кажется, решается другой библиотекой! Это не то, как учиться

user9173577 26.10.2018 16:38

Ага. Опять же, чтобы поэкспериментировать, проще использовать уже существующую библиотеку, чем заново изобретать колесо :). Да, на производственных серверах имеет смысл использовать родной!

iyerrama29 26.10.2018 16:41

Другие вопросы по теме