NodeJS + Mongoose连接超时问题

3

我了解到,用于NodeJS的Mongoose驱动程序会缓存查询,直到连接到MongoDB(没有超时)。但是当数据库崩溃时,应该可以向用户发送消息。因此,让我们来看一下这段NodeJS代码:

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

这可能会一直挂起。因此,解决此问题的一种方法是执行以下操作。
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个回答

2

我通过在使用数据库的每个路由器中添加一个附加步骤来解决了这个问题。

虽然有些凌乱,但它有效并且绝对没有泄漏。

类似于以下内容:

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

如果您了解更好的解决方案,请告诉我。


0

我希望我正确理解了你的问题,我认为你担心的是,因为mongoose采用乐观模式,并让你默认它最终会连接成功,所以你担心当连接失败时无法优雅地处理该情况。

Connection.open()方法接受一个回调函数作为最后一个参数。如果无法打开连接,这个回调函数将被调用,并传入一个错误对象作为参数。根据mongoose的源码(端口和选项是可选的):

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

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


快要完成了。但我真正需要的是:我的服务器连接到数据库。过一段时间,数据库崩溃了,当用户调用一个视图,比如Users.save(...)时,连接就会挂起。所以现在我想捕获那个数据库连接失败的错误。我可以每次与数据库交互时重新连接(并在回调中做其他事情),但这似乎不太优雅。 - freakish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接