我正在尝试使用节点中的twitter数据,并且遇到了一些我认为应该与节点样式编码相关的路障。代码块用于获取推文,检查文本是否在mongo中,如果没有,则插入。
我发现的第一个绊脚石是,在尝试将i打印到控制台时,它会在开始迭代光标之前迭代遍历每个i。我想如果我能清除它可能会帮助我前进。这个足够的信息可以帮助我吗?
我拥有的是:
T.get('statuses/user_timeline', options , function(err, data) {
var db = MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
if(err)
throw err;
console.log("connected to the mongoDB !");
myCollection = db.collection('test_collection2');
for (var i = 0; i < data.length ; i++) {
//let's wrap this in a loop
docu = data[i];
//console.dir(data);
console.dir(i);
var cursor = myCollection.find({text : data[i].text}).limit(1);
cursor.each(function(err, doc) {
if (doc != null) {
console.dir('doc is not null');
console.dir(doc.text);
} else {
console.dir('doc is null - inserting');
myCollection.insert(docu, function(err, records){
console.log("Record added as "+records.text);
});
}
})
}
});
})
答案 0 :(得分:1)
问题只是因为Javascript是异步的。在Mongo中的find函数为您提供返回值之前,循环结束。
我会做以下或类似的事情 - 只是为了解释这个概念:
T.get('statuses/user_timeline', options , function(err, data) {
var db = MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
if(err)
throw err;
console.log("connected to the mongoDB !");
myCollection = db.collection('test_collection2');
var myfunction = function(correct_i,docu){
var cursor = myCollection.find({text : data[correct_i].text}).limit(1);
cursor.each(function(err, doc) {
if (doc != null) {
console.dir('doc is not null');
console.dir(doc.text);
} else {
console.dir('doc is null - inserting');
myCollection.insert(docu, function(err, records){
console.log("Record added as "+records.text);
});
}
})
};
for (var i = 0; i < data.length ; i++) {
//let's wrap this in a loop
docu = data[i];
//console.dir(data);
console.dir(i);
myfunction(i,docu);
}
});
})
这样每次查找/查找Mongo都会有正确的i。因为该函数将其作为参数