2013-04-21 2 views
3

У меня странная ситуация ...Как остановить маршрут Express.js от next()?

У меня есть веб-приложение Express.js, Node.js и Mongoose.

Один из маршрутов имеет обратный вызов мангуста, который вызывает response.send (...). Однако, поскольку после обратного вызова нет ничего другого, я подозреваю, что он автоматически переходит к следующему() маршруту.

Ex:

//getItem 
app.get('/api/ItemOne', isUserValid, routes.getItem); 
//getAnotherItem 
app.get('/api/getAnotherItem', isUserValid, routes.getAnotherItem); 

//Routes 
exports.getItem = function (req, res) { 
    //console.log ('In getItem'); 
    getItem .findOne({ some_id : some_id}, function(err, getItem){ 
     //console.log ('In getItem callback'); 
     res.send({ 
     itemName : getItem .itemName, 
     itemValue : getItem .itemValue; 
     }); 
    }) 
}); 

exports.getAnotherItem = function (req, res) { 
    //console.log ('In getAnotherItem'); 
    getAnotherItem.findOne({ some_id : some_id}, function(err, getAnotherItemRet){ 
     //console.log ('In getAnotherItem Callback'); 
     res.send({ 
     itemName : getAnotherItemRet.itemName, 
     itemValue : getAnotherItemRet.itemValue; 
     }); 
    }) 
}); 

я получаю следующую последовательность сообщений на консоли ...

In getItem 
In getAnotherItem 
In getItem callback 
In getAnotherItem callback 

Я предполагаю, потому что маршрут не заканчивается, он вызывает следующий() автоматически.

В: Как предотвратить автоматический вызов второго маршрута.

ответ

2

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

В любом случае, хотя, "/ апи/GetItem" не называют "/ API/getAnotherItem" по двум причинам:

  1. если вы звоните рядом в "/ API/GetItem", он будет вызывать следующий соответствующий маршрут, в этом случае он будет соответствовать либо маршруту на «/ api», «/», либо вообще ничего. функция next() в основном вызывает «родительский» маршрут.
  2. Next() должен быть вызван явно, если вы не вернете ответ, выражение будет просто ждать неопределенно до тех пор, пока не вызывается res.send (каким образом он может обрабатывать функции async).

Возможно, у вас есть какое-то промежуточное ПО (I.E., используемое с app.use, а не app.get), которое может вызвать что-то подобное, но, скорее всего, вы оба вызываете оба URL одновременно.

+0

Спасибо, Illniyar. Хороший улов ... Я на самом деле вызывал оба URL одновременно. Я переделал код и начал видеть эту проблему. Следовательно, предполагалось, что это проблема с маршрутами. –

4

Try реверсирования req и res:

// wrong 
exports.getItem = function (res, req) { 
// right 
exports.getItem = function (req, res) { 

(и то же самое для getAnotherItem).

+0

Приношу свои извинения - это (req, res). Для простоты я редактировал код и случайно менял его, прежде чем задать вопрос здесь. Я отредактировал этот вопрос выше. Спасибо, что указали. –

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