2015-04-30 3 views
1

Im тестирует следующие строки кода.ExpressJS next ('route') нарушает мой маршрут

router.get('/testAPI', function(req, res, next){ 
    console.log('middleware 1'); 
    next(); 
}, function(req, res, next) { 
    console.log('middleware 2'); 
    next(); 
}, function(req, res){ 
    res.send({ SecretData: 'abc123' }); 
}); 

Работает должным образом. Однако при попытке добавить:

console.log('middleware 1'); 
next('route'); 

вместо этого в ПО промежуточного слоя 1, так что я могу пропустить промежуточное программное обеспечение 2, я получаю ошибку 404 на маршруте: Невозможно GET/API/TestApi

Кто-нибудь есть какие-либо предложения/идеи о почему это происходит?

На самом деле я верю, что его перенаправление на мой '/' маршрутизатор, а не на мой маршрутизатор '/ api', потому что, когда я добавляю маршрут по умолчанию в мой '/' маршрутизатор, я получаю этот маршрут, а не ошибку 404.

ответ

4

documentation объясняет:

Вы можете предоставить несколько функции обратного вызова, которые ведут себя так же, как промежуточный слой, за исключением того, эти функции обратного вызов могут вызвать следующий («маршрут») в байпас оставшегося маршрута обратного вызова (s)

Другими словами, позвонив по телефону next('route'), вы говорите Экспресс, чтобы не беспокоиться о остальных обратных вызовах, которые вы передаете для этого маршрута.

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

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

app.get('/testAPI', function(req, res, next) { 
    console.log('middleware 1'); 
    next('route'); 
}, function(req, res, next) { 
    // skipped... 
    console.log('middleware 2'); 
    next(); 
}); 

app.get('/testAPI', function(req, res) { 
    res.send({ SecretData: 'abc123' }); 
}); 
+0

Спасибо! Это работает, как и ожидалось, я ценю ваш ответ;) –

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