NodeJS +连接时的Mongoose超时

时间:2012-02-21 22:13:00

标签: javascript node.js mongodb timeout mongoose

所以我读到mongoose driver用于NodeJS缓存查询,直到它连接到MongoDB(没有超时)。但是当db崩溃时,应该可以向用户发送消息。那么让我们来看看这个NodeJS代码:

Users.find({}, function(err, result) {
  // Do something with result and send response to the user
});

这可能会挂在infintum上。因此解决此问题的一种方法是执行以下操作

var timeout = setTimeout(function() {
  // whem we hit timeout, respond to the user with appropriate message
}, 10000);

Users.find({}, function(err, result) {
  clearTimeout(timeout);  // forget about error
  // Do something with result and send response to the user
});

问题是:这是一个好方法吗?那么内存泄漏(挂起对MongoDB的查询)?

2 个答案:

答案 0 :(得分:2)

我通过在每个使用DB的路由器中添加一个额外的步骤来解决这个问题。

它有点乱,但它有效,100%没有泄漏。

这样的事情:

// file: 'routes/api/v0/users.js'
router
var User = require('../../../models/user').User,
    rest = require('../../../controllers/api/v0/rest')(User),
    checkDB = require('../../../middleware/checkDB');

module.exports = function (app) {
  app.get('/api/v0/users', checkDB, rest.get);
  app.get('/api/v0/users/:id', checkDB, rest.getById);
  app.post('/api/v0/users', checkDB, rest.post);
  app.delete('/api/v0/users', checkDB, rest.deleteById);
  app.put('/api/v0/users', checkDB, rest.putById);
};

// file: 'middleware/checkDB.js'
var HttpError = require('../error').HttpError,
    mongoose = require('../lib/mongoose');

// method which checks is DB ready for work or not
module.exports = function(req, res, next) {
  if (mongoose.connection.readyState !== 1) {
    return next(new HttpError(500, "DataBase disconnected"));
  }
  next();
};

PS如果你更了解解决方案,请告诉我。

答案 1 :(得分:0)

我希望我能正确理解你的问题,我觉得你很担心,因为猫鼬采取乐观的态度并且让你理所当然地认为它最终会联系起来,你担心你将无法在连接失败时优雅地处理案例。

Connection.open()方法接受回调作为最后一个参数。如果无法打开连接,则将使用Error对象作为参数调用此回调。来自mongoose的来源(端口和选项是可选的):

Connection.prototype.open = function (host, database, port, options, callback)

或者,您可以订阅Connection的“错误”事件。它还接收错误对象作为参数。但是,只有在所有参数(和状态)都有效的情况下才会发出它,而每次都会调用回调,即使例如在实际连接尝试之前出现问题(例如连接不在readyState中),即使连接成功(在这种情况下,error参数为null)。