2014-02-18 1 views
1
app.use(function(req,res,next){ console.log('middleware executed'); next(); }); 
app.get('/1',function(req,res){ console.log('/1'); res.end(); }); 
app.get('/2',function(req,res){ console.log('/2'); res.end(); }); 
... 

Это работает. Среднее ПО, выполняемое по запросам как 1, так и 2.Действия Strange express.use() в NodeJS

Теперь я хочу, чтобы промежуточного слоя не может быть выполнен по запросу стр/1, но и на всех страницах ниже:

app.get('/1',function(req,res){ console.log('/1'); res.end(); }); 
app.use(function(req,res,next){ console.log('middleware executed'); next(); }); 
app.get('/2',function(req,res){ console.log('/2'); res.end(); }); 
... 

В этом случае промежуточного слоя не будет выполнять. Даже на странице запроса/2. Что не так? Как это решить?

ответ

2

Причина в том, что после объявления маршрута экспресс (под капотом) вставляет промежуточное ПО маршрутизатора в цепочку промежуточного программного обеспечения. Это означает, что любые входящие запросы будут обрабатываться маршрутизатором и, вероятно, не будут переданы никакому промежуточному программному обеспечению, объявленному после маршрутизатора/маршрута.

@ Предложение jgitter о включении промежуточного программного обеспечения в декларации маршрута будет работать нормально.

Другой вариант заключается в использовании app.all вместо app.use:

app.get('/1',function(req,res){ console.log('/1'); res.end(); }); 
app.all('*', function(req,res,next){ console.log('middleware executed'); next(); }); 
app.get('/2',function(req,res){ console.log('/2'); res.end(); }); 
+0

Вы, вероятно, означает 'app.use' вместо' all.use'. ;) –

+0

@ E_net4 duh, спасибо, что указали это;) исправлено – robertklep

1

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

var middleware = function (req, res, next) { 
    // do things 
    next(); 
}; 
app.get('/1', middleware, function(req, res) { /* handle request */ }); 
app.get('/2', function(req, res) { /* handle request */ }); 

Вы также можете добавить путь монтирования в качестве необязательного первого параметра метода app.use().

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