NodeJS 生成器永远不会到达某一行?
NodeJS generator never reaches a certain line?
我正在使用 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();
}
我从未到达函数末尾的控制台语句
您正在打开数据库连接并尝试使用数据库连接进行操作,因此您可以尝试使用 async.each 并且在完成每个功能后您可以关闭连接,我看到这就是问题所在那里。
很可能存在您没有注意到的异步异常。你应该使用
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();
}
}
另外不要忘记在 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 );
}
我正在使用 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();
}
我从未到达函数末尾的控制台语句
您正在打开数据库连接并尝试使用数据库连接进行操作,因此您可以尝试使用 async.each 并且在完成每个功能后您可以关闭连接,我看到这就是问题所在那里。
很可能存在您没有注意到的异步异常。你应该使用
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();
}
}
另外不要忘记在 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 );
}