2013-07-22 33 views
5

Tôi có một ứng dụng với MongoDB làm phụ trợ hay không. Khi ứng dụng được khởi động, tôi thiết lập kết nối và sử dụng nó sau này theo yêu cầu.Cách kiểm tra xem kết nối MongoDB có còn sống trong Node.js

Nhưng nếu trong thời gian có nghĩa là db conncetion của tôi không thành công (ví dụ: tai nạn mongod), làm thế nào tôi có thể kiểm tra điều đó vào thời gian yêu cầu?

Để làm rõ một chút:

  • hiện tại tôi có một "api.js", mà không db.once('open', function../* setup */)
  • theo yêu cầu, tôi làm db.find(conditions, function(err, res) { if (err) ...else ...}).

Điều tôi muốn làm là kiểm tra xem kết nối có còn hoạt động trước mệnh đề db.find() hay không. Vì vậy, nếu nó xuống, tôi có thể thử khởi động lại kết nối db.

P.S. Tôi biết, tôi có lẽ nên đặt một số loại hồ bơi kết nối hoặc tương tự thay vì giữ kết nối luôn luôn hoạt động, nhưng ngay bây giờ nó được thiết lập như nó được.

+0

Ok, giả sử cách nhanh nhất để -xảy ra lỗi trong trạng thái kết nối sẽ là lần đầu tiên thử hoạt động và thử lại không thành công (http://stackoverflow.com/questions/8936922/is-inserting-a-new-database -như-nhanh hơn-kiểm tra-nếu-the-entry-tồn tại-đầu tiên) những gì sẽ là cách thanh lịch nhất để đóng gói mà thử lại, bạn có nghĩ? – Montagist

Trả lời

5

Bạn có thể sử dụng sự kiện để xử lý sự kiện đó dưới dạng gọi lại.
Và có thể có biến toàn cầu của bạn sẽ xác định rằng nó không được kết nối.

Bạn có thể có tệp db.js riêng biệt, tệp này sẽ hoạt động như mô-đun. Và bạn có thể có chức năng để lấy bộ sưu tập từ nó.

var mongodb = require('mongodb'); 
var client; 
var collections = { }; 

new mongodb.Db(...).open((function (err, c) { 
    if (!err) { 
    client = c; 
    client.on('close', function() { 
     client = null; // clear client 
     collections = { }; // clear old collections 
     // connection closed 
    }); 
    } else { 
    // error connecting 
    } 
}); 

// get collection 
exports.get = function(name, callback) { 
    if (client) { 
    if (!collections[name]) { 
     collections[name] = new mongodb.Collection(client, name); 
    } 
    callback(null, collections[name]); 
    } else { 
    // can perform reconnecting and then get collection and call callback 
    callback(new Error('not connected')); 
    } 
} 

Vì vậy, để sử dụng nó:

var db = require('./db.js'); 

db.get('users', function(err, collection) { 
    if (!err) { 
    collection.find({ ... 
    } else { 
    console.log(err); 
    } 
}); 

Xin lỗi, chỉ nhận thấy bạn đang sử dụng Mongoose, mà có thể khác nhau một chút.

+1

Đó là những gì tôi làm hiện tại - tôi làm, tức là. users.find ({}, function (err, res) {if (err) .... else ...}) ;. Tôi tự hỏi nếu có một cách để kiểm tra kết nối trước khi gửi một yêu cầu để tôi đầu tiên cố gắng khôi phục lại kết nối. – Zlatko

+0

Tôi đã cập nhật câu trả lời, bao gồm giải pháp đáng tin cậy hơn. – moka

+0

Tôi không thấy cách giải quyết câu hỏi này. Bạn gặp lỗi. Lỗi đó có thể là do một số thứ, không phải tất cả liên quan đến kết nối. – Montagist

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