2012-08-30 40 views
8

So. Tôi có một kịch bản rất cơ bản, kết nối với cơ sở dữ liệu và thực hiện find trên bộ sưu tập có nhiều tài liệu và giới hạn nó thành 3 mục. Mọi thứ diễn ra suôn sẻ ngoại trừ ở cuối kết quả của tôi, null và tập lệnh không kết thúc thay vì đóng kết nối lặng lẽ sau khi đã thành công.node-mongodb-native - con trỏ trả về null là giá trị cuối cùng trong mỗi cuộc gọi

Ở đây tôi tuyên bố params của tôi và tạo đối tượng cơ sở dữ liệu của tôi:

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}), 
    {}); 

Và ở đây tôi kết nối với cơ sở dữ liệu và tiến hành để truy vấn nó với một con trỏ findeach chức năng:

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(); 
}); 

Kết quả đẹp:

{ _id: '1', 
    a: 'first object' } 
{ _id: '2', 
    a: 'second object' } 
{ _id: '3', 
    a: 'third object' } 

cho đến khi có một số điện thoại

null 

xuất hiện.

Như đã nêu ở trên, tập lệnh sau đó tiến hành không chấm dứt.

Tôi không hiểu tại sao và sẽ đánh giá cao con trỏ về cách làm cho nó chấm dứt độc đáo.

Trả lời

7

Vâng, điều đó thật ngu xuẩn. Quá nhiều thời gian mà không cần lập trình trong thiết lập không đồng bộ và bạn mắc lỗi: cuộc gọi db.close() xuất hiện trước khi vòng lặp each kết thúc. Đã trả lại null và bị treo cổ vì lý do đó. Đây là mã chính xác:

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(); 
}); 
}); 

Tôi hy vọng nó sẽ tiết kiệm một số phút cho ai đó, bằng cách nào đó.

10

Câu hỏi này là một vài năm tuổi, và đã có một câu trả lời có thể, nhưng tôi chỉ muốn chỉ ra một khả năng cho bất cứ ai vẫn còn bối rối sau khi đọc này. Hóa ra, each liên tục gọi nextObject mà thực sự được dự định trả về null khi con trỏ hết.

Câu trả lời ở đây là người tôi cần: Node Mongo Native - how to tell when a cursor is exhausted?

Từ các tài liệu tài xế Node MongoDB: http://mongodb.github.io/node-mongodb-native/api-generated/cursor.html#nextobject

+1

này nên là câu trả lời thực tế. – Julian

+0

Thậm chí, tôi đã nhận được một giá trị cuối cùng trong khi gọi đến cursor.each. phiên bản nodejs: 0.12.9, phiên bản dod Mongodb:^2.2.33. Tốt mà tôi đã thấy câu trả lời này. –

Các vấn đề liên quan