2016-01-16 74 views
0

我必须用MongoDB查询来填充我的risultato json,因此在循环结束时我必须使用hapijs控制器返回risultato 。 如果我在年底返回我有这样的错误:如何使用hapijs和猫鼬在循环中返回一个值

Error:reply interface called twice

如果我使用返回圈外它返回:

var risultato = { 
"models": [], 
} 

这是我的代码:

Myfunction: function(request, reply) { 

    var risultato = { 
    "models": [], 
    } 

    for(var i=0; i<3; i++){ 
    Collections     //this is a mongoose model 
     .findOne() 
     .where({_id: id]}) 
     .populate('models') 
     .exec(function(err, result) { 
     risultato.models.push.apply(risultato, result.models); 
     console.log(risultato) 
     return reply(risultato) 

     }); 
    } 
}; 

我该怎么办?

回答

2

您在for循环中运行异步查询,每个查询都在其处理程序中调用reply()方法。

您需要使用一个异步循环或一个系统,您可以在返回之前判断是否调用了所有三个回调。

Myfunction: function(request, reply) { 

var risultato = { 
"models": [], 
} 

for(var i=0; i<3; i++){ 
Collections     //this is a mongoose model 
    .findOne() 
    .where({_id: id]}) 
    .populate('models') 
    .exec(function(err, result) { 


     risultato.models.push.apply(risultato, result.models); 
     console.log(risultato) 

     if (resultato.models.length === 3) //All callbacks have returned 
     { 
      reply(risultato); 
     } 

    }); 
} 
} 

最好的方法是使用async库。尽早开始使用,以后不会有问题。

var async = require('async'); 

Myfunction: function(request, reply) { 

    var queries = []; 

    for(var i=0; i<3; i++) { 

    queries.push(function(callback){ 

     Collections     //this is a mongoose model 
     .findOne() 
     .where({_id: id]}) 
     .populate('models') 
     .exec(function(err, result) { 
     console.log(risultato) 
     callback(err, result); 
     }); 
    }); 

    } 

    async.parallel(queries, function (err, result) { 

    reply({models: result}); 
    }) 
}; 
+0

谢谢,我会使用它,因为这种解决方案的作品,但它不是真正的好... :) –

+0

的解决方案只是解决ü写的查询,正如我刚才所说,最好的办法是使用一个异步循环。 – ZeMoon

+0

是的,我知道,非常感谢。 –

1

您可以通过promiseFor通过BlueBird(一个承诺库)包实现它:

随着异步模块,同样的查询可以如下执行。

var Promise = require('bluebird'); 

var promiseFor = Promise.method(function(condition, action, value) { 
    if (!condition(value)) return value; 
    return action(value).then(promiseFor.bind(null, condition, action)); 
}); 

Myfunction: function(request, reply) { 
    var risultato = { 
     "models": [], 
    } 

    promiseFor(function(count) { 
     return count < 3; 
    }, function(count) { 
     return Collections 
      .findOne() 
      .where({_id: id]}) 
      .populate('models') 
      .exec(function(err, result) { 
       risultato.models.push.apply(risultato, result.models); 
       console.log(risultato) 
       return ++count; 
      }); 
    }, 0).then(function() { 
     reply(risultato); 
    }); 

} 
+0

它给了我这个错误 TypeError:Promise.method不是函数 –

+0

什么是你的节点版本? – zangw

+0

我的节点版本是4.0.0 –