Javascript NodeJS生成器从未到达某一行?

Javascript NodeJS生成器从未到达某一行?,javascript,node.js,ecmascript-6,generator,co,Javascript,Node.js,Ecmascript 6,Generator,Co,我正在使用co运行一个生成器函数,该函数对数据进行一些刮取和清理。然而,在循环之后,我从未到达代码的某一部分。我的代码是这样的: function*(){ var url = "mongodb://" + config.host + ":" + config.port + "/" + config.db; var db = yield MongoClient.connect( url ); for( var establishment in [ {"establishment_id"

我正在使用
co
运行一个生成器函数,该函数对数据进行一些刮取和清理。然而,在循环之后,我从未到达代码的某一部分。我的代码是这样的:

function*(){
  var url = "mongodb://" + config.host + ":" + config.port + "/" + config.db;
  var db = yield MongoClient.connect( url );
  for( var establishment in [ {"establishment_id": 16} ] ){
    var establishment_type = establishment.id;
    var response = yield getRestaurants( establishment_type );
    var restaurants = JSON.parse( response.body ).restaurants;
    // here we create our restaurants in "saveable" form
    var saveableRestaurants = [];
    for(var i = 0; i < restaurants.length; i++){
        var saveableRestaurant = restaurants[i].restaurant;
        saveableRestaurant._id = restaurants[i].restaurant.R.res_id;
        // Remove unwanted fields
        //... code removed for brevity ...
        // convert cuisine string into its appropriate id form
        var cuisines = saveableRestaurant.cuisines.split(",");
        var ids = [];
        for( var i = 0; i < cuisines.length; i++ ){
            console.log("LOOKING UP ID FOR ", cuisines[i]);
            var match = yield db.collection(CUI).findOne({"cuisine_name":cuisines[i].trim()});
            console.log("ID FOR ", cuisines[i], " IS", match.cuisine_id);
            ids.push( id );
        }
        // I NEVER REACH THIS LINE!!!!
        console.log( "ALL IDS ", ids );
    }
  }
  db.close();
}  
函数*(){
var url=“mongodb://”+config.host+:“+config.port+”/“+config.db;
var db=yield MongoClient.connect(url);
对于(在[{“设置\设置id:16}]中设置var){
风险值建立类型=建立id;
var响应=收益率(机构类型);
var restaurants=JSON.parse(response.body).restaurants;
//在这里,我们以“可保存”的形式创建餐厅
var saveableRestaurants=[];
对于(变量i=0;i<0.length;i++){
var saveableRestaurant=restaurants[i]。restaurant;
saveableRestaurant.\u id=restaurants[i].restaurant.R.resu id;
//删除不需要的字段
//…为简洁起见,已删除代码。。。
//将字符串转换为其相应的id形式
var cuisines=saveableRestaurant.cuisines.split(“,”);
var-id=[];
对于(变量i=0;i

我从未在函数末尾看到console语句

您正在打开db连接,并且正在尝试使用db连接进行操作,因此您可以尝试使用async。在完成每个功能后,您可以关闭连接,我看到问题就在那里。

您正在打开db连接,并且正在尝试使用db连接进行操作,因此您可以尝试使用async。在完成每个功能后,您可以关闭连接,我发现这就是问题所在。

很可能存在您没有注意到的异步异常。你应该使用

function*() {
  var url = "mongodb://" + config.host + ":" + config.port + "/" + config.db;
  var db = yield MongoClient.connect( url );
  try {
    for (var establishment of [ {"establishment_id": 16} ]) {
      var establishment_type = establishment.id;
      var response = yield getRestaurants( establishment_type );
      var restaurants = JSON.parse( response.body ).restaurants;
      // here we create our restaurants in "saveable" form
      var saveableRestaurants = [];
      for (var i = 0; i < restaurants.length; i++) {
        var saveableRestaurant = restaurants[i].restaurant;
        saveableRestaurant._id = restaurants[i].restaurant.R.res_id;
        // Remove unwanted fields
        //... code removed for brevity ...
        // convert cuisine string into its appropriate id form
        var cuisines = saveableRestaurant.cuisines.split(",");
        var ids = [];
        for (var i = 0; i < cuisines.length; i++) {
          console.log("LOOKING UP ID FOR ", cuisines[i]);
          var match = yield db.collection(CUI).findOne({"cuisine_name":cuisines[i].trim()});
          console.log("ID FOR ", cuisines[i], " IS", match.cuisine_id);
          ids.push( id );
        }
        console.log( "ALL IDS ", ids );
      }
    }
  } finally {
    db.close();
  }
}
函数*(){
var url=“mongodb://”+config.host+:“+config.port+”/“+config.db;
var db=yield MongoClient.connect(url);
试一试{
对于(var建立[{“建立id”:16}]){
风险值建立类型=建立id;
var响应=收益率(机构类型);
var restaurants=JSON.parse(response.body).restaurants;
//在这里,我们以“可保存”的形式创建餐厅
var saveableRestaurants=[];
对于(变量i=0;i<0.length;i++){
var saveableRestaurant=restaurants[i]。restaurant;
saveableRestaurant.\u id=restaurants[i].restaurant.R.resu id;
//删除不需要的字段
//…为简洁起见,已删除代码。。。
//将字符串转换为其相应的id形式
var cuisines=saveableRestaurant.cuisines.split(“,”);
var-id=[];
对于(变量i=0;i

另外,不要忘记在由
co

返回的承诺上添加一个
.catch(e=>console.error(e))
,很可能存在您没有注意到的异步异常。你应该使用

function*() {
  var url = "mongodb://" + config.host + ":" + config.port + "/" + config.db;
  var db = yield MongoClient.connect( url );
  try {
    for (var establishment of [ {"establishment_id": 16} ]) {
      var establishment_type = establishment.id;
      var response = yield getRestaurants( establishment_type );
      var restaurants = JSON.parse( response.body ).restaurants;
      // here we create our restaurants in "saveable" form
      var saveableRestaurants = [];
      for (var i = 0; i < restaurants.length; i++) {
        var saveableRestaurant = restaurants[i].restaurant;
        saveableRestaurant._id = restaurants[i].restaurant.R.res_id;
        // Remove unwanted fields
        //... code removed for brevity ...
        // convert cuisine string into its appropriate id form
        var cuisines = saveableRestaurant.cuisines.split(",");
        var ids = [];
        for (var i = 0; i < cuisines.length; i++) {
          console.log("LOOKING UP ID FOR ", cuisines[i]);
          var match = yield db.collection(CUI).findOne({"cuisine_name":cuisines[i].trim()});
          console.log("ID FOR ", cuisines[i], " IS", match.cuisine_id);
          ids.push( id );
        }
        console.log( "ALL IDS ", ids );
      }
    }
  } finally {
    db.close();
  }
}
函数*(){
var url=“mongodb://”+config.host+:“+config.port+”/“+config.db;
var db=yield MongoClient.connect(url);
试一试{
对于(var建立[{“建立id”:16}]){
风险值建立类型=建立id;
var响应=收益率(机构类型);
var restaurants=JSON.parse(response.body).restaurants;
//在这里,我们以“可保存”的形式创建餐厅
var saveableRestaurants=[];
对于(变量i=0;i<0.length;i++){
var saveableRestaurant=restaurants[i]。restaurant;
saveableRestaurant.\u id=restaurants[i].restaurant.R.resu id;
//删除不需要的字段
//…为简洁起见,已删除代码。。。
//将字符串转换为其相应的id形式
var cuisines=saveableRestaurant.cuisines.split(“,”);
var-id=[];
对于(变量i=0;i

另外,不要忘记在由
co

返回的承诺上添加一个
.catch(e=>console.error(e))
,在浏览了MongoDB文档之后,我找到了解决方案:

var matches = db.collection( CUI ).find({"cuisine_name" : { "$in" : cuisines }});
while( yield matches.hasNext() ){
  var match = yield matches.next();
  ids.push( match.cuisine_id );  
}

在浏览了MongoDB文档之后,我找到了解决方案:

var matches = db.collection( CUI ).find({"cuisine_name" : { "$in" : cuisines }});
while( yield matches.hasNext() ){
  var match = yield matches.next();
  ids.push( match.cuisine_id );  
}

mongo模块是异步的。您的db在发电机启动之前关闭yield@SterlingArcher那么出路是什么呢?我没有在
co
中看到
finally()
done()
:我用蓝鸟和巴贝尔解决了这个问题。Bluebird用于Promission,babel用于ES7等待/异步。下面是我如何(在帮助下)与co合作的一个例子,你必须做出承诺,然后像平常一样使用。然后等等。它不会使异步逻辑消失。@KevinB如果我在
中将
db.close()
移动到它自己的函数中,那么()
,这会解决问题吗?抱歉,如果我的问题是基本的,mongo模块是异步的。您的数据库在生成器ca之前关闭