Проверьте динамический маршрут экспресс JS - PullRequest
0 голосов
/ 15 октября 2018

У меня есть несколько маршрутов, например /login/:provider/:id, и когда запрос выполняется, он получает что-то вроде /login/provider1/123.Пока все хорошо, но проблема возникает, когда я хочу иметь определенные маршруты без аутентификации для своего промежуточного программного обеспечения.

До сих пор я пытался так:

public static getString(value: String): String {
        let values = value.split('/');
        if (values.length <= 2) return value;
        return values.slice(0, values.length - 1).reduce(((previousValue, currentValue) => {
            return previousValue + "/" + currentValue;
        }));
    }

, но это не очень универсальнои не улавливает все случаи.

То, что должно соответствовать исходному маршруту:

/login/anything/anything

Поэтому я выбрал этот маршрут: /login/:provider/:id, который имеет 3сегменты: [логин, провайдер, идентификатор], поэтому все, что начинается с / логина и имеет такое же количество сегментов, должно совпадать.

и не должно совпадать с чем-либо без одинаковой длины сегментов.

Мой вопрос: существует ли какой-либо конкретный способ получения исходного маршрута без зацикливания после выполнения запроса?Возможно ли то, что я спрашиваю, через регулярное выражение?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Единственное грязное решение, которое я придумал, это:

public static doesNotRequireAuth(value: String): boolean {
        let delimiter = "/";
        let segments = value.split(delimiter);
        let conditionMet = false;
        getNoAuthRoutes().forEach((item) => {
            let itemSegments = item.split(delimiter);
            if (segments[1] === itemSegments[1] && segments.length === itemSegments.length) {
                conditionMet = true;
                return;
            }
        });
        return conditionMet;
    }

, где getNoAuthRoutes() - это Set<String>.

Надеюсь, это кому-нибудь поможет !!!

0 голосов
/ 15 октября 2018

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

Вы можете создавать маршрутизаторы.

var app = express();
var router = express.Router();

router.param(function(param, validator) {
    return function(req, res, next, val) {
        // You have full access to req. So you can get anything from it.
        if (validator(val)) {
            next(); //validator success no need for authorization.
        } else {
            if (req.headers.Authentication) {
                next() //Validator failed but we have token in header and it is valid.
            } else {
                res.sendStatus(403); //Validator failed and token does not exists.
            }
        }
    }
});


router.param('provider', function(candidate) {
    return candidate === 'myprovider' //Provider condition that will bypass authorization.
});

router.get('/login/:provider/:id', function (req, res) { //register the route
  res.send('OK');
});

app.use(router);

Редактировать 2 (Еще одна попытка):

app.all('/:id/:name', (req, res, next) => {
  console.log(req.params);
  next();
});

Это будет соответствовать только этому типу маршрутов.И он будет работать до них, поэтому у вас есть доступ ко всем необходимым параметрам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...