Совпадение с образцом в остальном URL узла nodejs - PullRequest
0 голосов
/ 18 января 2019

В своем приложении узла я использую router.use для проверки токена. Я хочу пропустить проверку для нескольких URL-адресов, поэтому я хочу проверить, соответствует ли URL-адрес, затем вызвать next ();

Но URL, который я хочу пропустить, содержит URLparam

Например, это URL / service /: appname / getall. Это должно быть сопоставлено с / service / blah / getall и дать истинное значение.

Как этого достичь, не разбивая URL-адрес на '/'

Заранее спасибо.

1 Ответ

0 голосов
/ 18 января 2019

Параметры будут соответствовать :[^/]+, потому что это :, за которым следует что-либо кроме / 1 или более раз.

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

let template = '/service/:appname/getall'
let url = '/service/blah/getall'

// find params and replace them with regex
template = template.replace(/:[^/]+/g, '([^/]+)')

// the template is now a regex string '/service/[^/]+/getall'
// which is essentially '/service/ ANYTHING THAT'S NOT A '/' /getall'

// convert to regex and only match from start to end
template = new RegExp(`^${template}$`)

// ^ = beggin
// $ = end
// the template is now /^\/service\/([^\/]+)\/getall$/

matches = url.match(template)
// matches will be null is there is no match.

console.log(matches)
// ["/service/blah/getall", "blah"]
// it will be [full_match, param1, param2...]

Редактировать: использовать \w вместо [^/], потому что:

Название параметров маршрута должно состоять из «словесных символов» ([A-Za-z0-9_]). https://expressjs.com/en/guide/routing.html#route-parameters

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

let template = '/service/:app-:version/get/:amt';
let url = '/service/blah-v1.0.0/get/all';

template = template.replace(/:\w+/g, `([^/]+)` );

template = new RegExp(`^${template}$`);
let matches = url.match(template);

console.log(url);
console.log(template);
console.log(matches);
// Array(4) ["/service/blah-v1.0.0/get/all", "blah", "v1.0.0", "all"]
...