2013-12-14 6 views
0

Я создаю CMS в node.js и Express. Я разрешаю пользователям создавать свои собственные подразделы на сайте. Подсектором может быть блог, страница или форум. Эти подразделы могут быть установлены на один уровень в пути сайта URL-адрес, так, например:Отправка маршрута Express.js на основе первого параметра?

domain.com/custom-path-blog/ 

Я бы поддержать следующую структуру URL-адрес с экспресс-маршруты:

domain.com/custom-path-blog/ -> blog index 
domain.com/custom-path-blog/page/5 -> list posts on page 5 
domain.com/custom-path-blog/guides/ -> list posts that belong to guides category 
domain.com/custom-path-blog/guides/this-is-a-post -> shows a post 

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

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

Как только я знаю, что подраздел является блогом или форумом или магазином электронной коммерции, как я могу отправить URL-адрес этого «настраиваемого пути-блога», который будет обработан соответствующим механизмом экспресс-маршрутизации?

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

Спасибо!

ответ

2

Если у вас уже есть 3 отделенных приложений (страница, блог, форум), и вы хотите, чтобы запустить его в процессе 1 узла вы можете сделать это:

app.use('/page', pageApp); 
app.use('/blog', blogApp); 
app.use('/forum', forumApp); 

экспресс будет вырезать первый компонент url для вас.


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

function appSelector(req, res, next) { 
    var firstComponent = getFirtCompoent(req.url.pathname) // return page or blog ... 
    var userID = req.user.id; 
    detectAppForCurrentUser(firstCompoent, userID, function (type) { 
     if(type === 'page') { 
      removeFirstComponent(req); 
      return pageApp(req, res, next); 
     } 

     if(type === 'blog') { 
      removeFirstComponent(req); 
      return blogApp(req, res, next); 
     } 

     next(); // if not found continue with other routes 
    } 
} 

app.use(appSelector); 
// TODO other routes here 

Есть много способов решить проблему, но это важное правило: app.use, app.get вызывается только на этапе инициализации

+0

Спасибо за приятный ответ. Что вы подразумеваете под этапом инициализации? Будет ли вызываться функция appSelector при каждом запросе? С уважением. – SrgHartman

+1

Этап инициализации означает, что при запуске процесса он должен вызывать перед app.listen. appSelector будет вызываться по каждому запросу, но он не будет вызываться, если есть более высокопоставленное промежуточное ПО, вызывающее res.end() – damphat

Смежные вопросы