5

我有一个奇怪的情况...

我有一个 Express.js、Node.js 和 Mongoose 网络应用程序。

其中一条路由有一个调用 response.send(...) 的 mongoose 回调。但是,由于回调之后没有其他内容,我怀疑它会自动转到 next() 路由。

前任:

//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

我假设因为路线没有完成,它会自动调用 next() 。

Q:如何防止第二条路由被自动调用。

4

2 回答 2

4

尝试反转reqres

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

(和同样的getAnotherItem)。

于 2013-04-21T18:22:30.727 回答
2

为了了解您为何按此顺序收到消息,我们需要知道您调用哪个 url 来生成该消息。

但无论如何,“/api/getItem”不调用“/api/getAnotherItem”有两个原因:

  1. 如果你在“/api/getItem”中调用next,它将调用下一个匹配的路由,在这种情况下,它将匹配“/api”、“/”上的路由或什么都不匹配。next() 函数基本上调用路由的“父级”。
  2. Next() 必须显式调用,如果您不返回答案,express 将无限期地等待直到 res.send 被调用(这是它处理异步函数的方式)。

您可能有某种中间件(IE 与 app.use 一起使用而不是 app.get)可以调用类似的东西,但最有可能的是,您以某种方式同时调用两个 url。

于 2013-04-21T21:52:06.520 回答