Сложная маршрутизация NodeJS / Express REGEX - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь создать NodeJS Express API (маршрут), который имеет следующие характеристики:

У него есть базовый путь, в моем случае это /web/views.Эта часть является статическим значением и не изменяется до тех пор, пока сервер работает.

Я могу сделать это следующим образом:

const BASE = '/web/views';    // defined externally/elsewhere 

app.get(BASE, function handleRequest(req, res) {
    // handle API request...
}

Далее я ожидаю получитьресурс.Учитывая имя этого ресурса, я нахожу файл и отправляю его клиенту.

Я могу сделать это следующим образом:

app.get(BASE + '/:resource', function handleRequest(req, res) {
    var resource = req.params.resource;
    // handle API request...
}

Итак, на клиенте я вызываю его таким образом:

GET /web/views/header

Пока все это работает ... но моя проблема в том, что моим "ресурсом" может быть сам по себе путь, такой как:

GET /web/views/menu/dashboard

илиболее длинный путь, например:

GET /web/views/some/long/path/to/my/xyz

Я использовал следующее отображение REGEX:

const DEFAULT_REGEX = '/(\*/)?:resource';

или, точнее:

app.get(BASE + DEFAULT_REGEX, function handleRequest(req, res) {
    var resource = req.params.resource;
    // handle API request...
}

Это работает с произвольнымдлина пути между значением BASE и идентификатором :resource, но проблема в том, что моя переменная resource имеет только часть пути xyz, а не полный путь (т. е. /some/long/path/to/my/xyz).

Я мог бы просто обмануть и убрать ведущий BASE из req.url, но я думал, что для него будет правило REGEX.

Если кто-нибудь знает, как сделать такую ​​расширенную маршрутизацию REGEX,Буду признателен.

Спасибо!

1 Ответ

0 голосов
/ 26 сентября 2018

Конечно, поэтому я думаю, что самый простой способ - просто не беспокоиться об использовании Regex, а просто использовать подстановочный знак.Вы теряете классное имя params, но в остальном оно работает так, как вы ищете.Например:

const express = require('express');

const app = express();
const port = 3000;
const BASE = '/web/views'

app.get(`${BASE}/*`, (req, res) => {
  res.send(req.url);
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

Если вы нажмете http://localhost:3000/web/views/path/to/my/resource, в моем примере содержимое ответа будет /web/views/path/to/my/resource, так что оттуда есть несколько простых манипуляций со строками, чтобы получить нужный бит:

let resource = req.url.split('/web/views')[1];
// resource will equal /path/to/my/resource if the above URL is used

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

Вы даже можете настроить промежуточное ПО, чтобы заставить этот кусок ресурса работать с другими обработчиками:

app.use(`${BASE}/*`, (req, res, next) => {
   const resource = req.url.split(BASE)[1];
   req.resource = resource;
   next();
});

Тогда все последующие маршруты будут иметь доступ к req.resource.

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