首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node-mongodb-native - cursor在每次调用期间返回null作为最后一个值

node-mongodb-native - cursor在每次调用期间返回null作为最后一个值
EN

Stack Overflow用户
提问于 2012-08-31 05:06:40
回答 2查看 3K关注 0票数 8

所以。我有一个非常基本的脚本,它连接到一个数据库,并在有很多文档的集合上做一个find,并将其限制为3个项目。除了在我的结果结束时,null和脚本不会终止,而是在成功后悄悄关闭连接之外,一切都运行得很顺利。

在这里,我声明我的params并创建我的数据库对象:

代码语言:javascript
复制
var SERVER = 'localhost',
 PORT = 27017,
 DATABASE = 'test',
 COLLECTION = 'coll',
 mongo = require('mongodb'),
 db = new mongo.Db(DATABASE,
  new mongo.Server(SERVER, PORT, {auto_reconnect: true}),
  {});

在这里,我连接到数据库,并使用find游标和each函数继续查询它:

代码语言:javascript
复制
db.open(function(err, db) {
 if(err) throw err;
 var collection = new mongo.Collection(db, COLLECTION),
  cursor = collection.find({}, {}).limit(3);
 cursor.each(function(err, doc) {
  if(err) throw err;
  console.log(doc);
 });
 db.close();
});

结果很好:

代码语言:javascript
复制
{ _id: '1',
  a: 'first object' }
{ _id: '2',
  a: 'second object' }
{ _id: '3',
  a: 'third object' }

直到出现一个

代码语言:javascript
复制
null

就会出现。

如上所述,脚本随后不会终止。

我不明白为什么,我希望能给出一些建议,让它能很好地结束。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-31 06:24:06

好吧,那太愚蠢了。没有在异步设置中编程的时间太长,您就会犯错误:在each循环结束之前,就出现了db.close()调用。返回null并因此被绞死。下面是正确的代码:

代码语言:javascript
复制
db.open(function(err, db) {
 if(err) throw err;
 var collection = new mongo.Collection(db, COLLECTION),
  cursor = collection.find({}, {}).limit(3);
 cursor.each(function(err, doc) {
  if(err) throw err;
  if(doc !== null) console.log(doc);
  else db.close();
 });
});

我希望它能为某些人节省一些时间。

票数 7
EN

Stack Overflow用户

发布于 2015-06-24 04:09:27

这个问题已经有几年的历史了,而且已经有了可能的答案,但我只是想为那些在阅读本文后仍感到困惑的人指出另一种可能性。原来,each重复调用nextObject,这实际上是为了在游标耗尽时返回null。

这里的答案就是我需要的:Node Mongo Native - how to tell when a cursor is exhausted?

在节点MongoDB驱动程序文档中:http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#nextobject

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12205533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档