2016-02-15 2 views
3

Учитывая два промежуточного слоя, как вы можете добавить что-то, что попало бы первым, а затем определить, какое из промежуточного программного обеспечения передать запрос. Запрос можно отбрасывать или перенаправлять только на одно из промежуточного программного обеспечения, но не на обоих.Как пропустить или перейти к промежуточному программному обеспечению? (node)

app.use(function *(next) { 
    if (isAuthenticated) 
     *private middleware* 
    else 
     *use public middleware* 
}); 

Более конкретно:
У меня есть сайт /, который должен иметь переменную реакцию в зависимости от того, если пользователь вошел в систему или нет (с помощью маркера на основе AUTH здесь). Для простоты, если пользователь запроса не имеет токена, то public.html является ответом, а private.html - для запроса, имеющего действительный токен.
Теперь этого было бы достаточно просто, чтобы просто реализовать в рамках одной функции, но я хотел бы иметь отдельные маршрутизаторы, цифра, которая сохранит код более управляемым.
Так что мне нужно как-то быть в состоянии выбрать, который маршрутизатор промежуточного программного обеспечения обращается вправо? Не знаю, как это сделать.

var publicR = new router(); 
publicR.get('/', function *(next) { 
    ....public.html.... 
}); 
var privateR = new router(); 
privateR.get('/', function *(next) { 
    ....private.html.... 
}); 

app.use(function(){ 
    if(isAuthenticated) 
     ...use privateR.routes(); 
    else 
     ...use publicR.routes(); 
}); 
+0

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

+0

@ jfriend00 Извините, я не понимаю, что вы подразумеваете под «какой другой функцией назвать»? – House3272

+0

Вместо того, чтобы полагаться на цепочку промежуточного программного обеспечения, функции вызова, которые вы определили, при необходимости, при необходимости, «req» и ​​«res». –

ответ

3

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

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

Если вы действительно хотите иметь совершенно другой контент и поведение при входе в систему, тогда вы должны, вероятно, перенаправить на другой URL-адрес при входе в систему. В этом случае вы можете просто использовать совершенно другой маршрутизатор для входа в систему, URL-адрес. Это также будет работать лучше для поисковых систем, поскольку данный URL-адрес будет сообщать о согласованном содержимом и не будет отличаться в зависимости от состояния пользователя. Это также упрощает использование маршрутизаторов в Express. Ваш «вошедший в систему» ​​маршрутизатор обслуживает зарегистрированные URL-адреса. У вас может быть промежуточное программное обеспечение, которое проверяет входной URL, чтобы узнать, действительно ли вы вошли в систему и, если нет, перенаправляет обратно на страницу без регистрации и наоборот.

+0

Это правильный поток – Yerken

+1

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

1

В случае, если кто-то работает в этом вопросе, это работает для меня:

var publicR = new router(); 
publicR.get('/', function *(next) { 
    ....public.html.... 
}); 
var privateR = new router(); 
privateR.get('/', function *(next) { 
    ....private.html.... 
}); 

app.use(mySwitcher); 


function *mySwitcher(next){ 
    if(isAuthenticated) 
     yield privateR.routes().call(this,next); 
    else 
     yield publicR.routes().call(this,next); 
} 
Смежные вопросы