2012-07-27 35 views
11

Tôi đã chơi xung quanh với mongodb và nhập một số dữ liệu thử nghiệm {name: "david"} vào bộ sưu tập 'người dùng'. Tôi xác nhận rằng dữ liệu là trong MongoDB sử dụng vỏ Mongo bằng cách gõnode.js MongoDB truy vấn không trả lại kết quả

db.users.find() 

kết quả:

{ "name":"david" } 

Trong kịch bản Node.js, đoạn code sau:

db.open(function(err, db) { 
    if (!err) { 
     console.log("db opened!"); 
    } 
    else { 
     console.log(err); 
    } 
    db.collection('users', function(err, collection) { 
     collection.find({}, function(err, cursor) { 
      cursor.each(function(err, item) { 
       console.log(item); 
      }); 
     }); 
    }); 
    db.close(); 
}); 

không trả lại bất kỳ kết quả nào

Tôi không thấy điều gì sai và không trả về lỗi. Vui lòng thông báo cho

Trả lời

9

Bạn đang thực sự đóng kết nối cơ sở dữ liệu của bạn trước khi dữ liệu từ bộ sưu tập đã trở lại.

db.collection('users', function(err, collection) { 
    collection.find({}, function(err, cursor) { 
    cursor.each(function(err, item) { 
     console.log(item); 
    }); 

    // our collection has returned, now we can close the database 
    db.close(); 
    }); 
}); 
2

Mẫu này hoạt động tốt trong mẫu/nút mongo của tôi. Các chức năng được thông qua một cuộc gọi lại mà mất err, bộ sưu tập. Nó nhận được bộ sưu tập 'người dùng' và nếu thành công, các cuộc gọi sẽ tìm thấy đối với bộ sưu tập và chuyển đổi nó thành một mảng nhưng bạn cũng có thể lặp lại trên con trỏ.

Bên trong các cuộc gọi db.collection và connection.find, bạn không kiểm tra lỗi và xử lý. Bạn chỉ làm điều đó trên cuộc gọi mở.

Ngoài ra, bạn không nên gọi db.close() đặc biệt nếu bạn đang mở với connection pool option (bạn không muốn mở và đóng kết nối trên mọi cuộc gọi). Nếu bạn muốn đóng, sau đó đóng bên trong gọi lại.

Cái gì như:

var server = new Server(host, port, {auto_reconnect: true, poolSize: 5}, {}); 

MyStore.prototype.getUsers = function(callback) { 
server.open(function(err, db) { 
    if (err) { 
     callback(err); 
    } 
    else { 
     db.collection('users', function(err, collection) { 
      if(err) 
       callback(err); 
      else { 
       collection.find().toArray(function(err, users) { 
        if (err) { 
         callback(err) 
        } else { 
         callback(null, users); 
        } 
       }); 
      } 
     } 
    }}); 

Đây là một hướng dẫn về nút + Mongo có thể giúp: http://howtonode.org/express-mongodb

4

Vì CJohn tuyên bố chính xác bạn đang đóng kết nối DB TRƯỚC KHI bạn truy xuất dữ liệu. Tôi biết nó không giống như nó nhưng đây là trường hợp với cấu trúc Node và callbacks. Mã để xử lý chính xác điều này là:

db.open(function(err, db) { 
    if (err) return console.log('error opening db, err = ', err); 

    console.log("db opened!"); 

    db.collection('users', function(err, collection) { 
     if (err) return console.log('error opening users collection, err = ', err); 

     collection.find({}, function(err, cursor) { 
      if (err) return console.log('error initiating find on users, err = ', err); 

      cursor.each(function(err, item) { 
       // watch for both errors and the end of the data 
       if (err || ! item) { 
        // display (or do something more interesting) with the error 
        if (err) console.log('error walking data, err = ', err); 

        // close the connection when done OR on error 
        db.close(); 

        return; 
       } 
       console.log(item); 
      }); 
     }); 
    }); 
}); 
3

Thử nâng cấp nút của bạn lên phiên bản mới nhất.

sudo npm cache clean -f 
sudo npm install -g n 
sudo n stable 

phiên bản 0.4 có thể không hoạt động bình thường.

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