NodeJS + тайм-аут Mongoose при подключении - PullRequest
3 голосов
/ 22 февраля 2012

Итак, я прочитал, что драйвер mongoose для запросов кеша NodeJS, пока он не подключится к MongoDB (без таймаутов). Но когда происходит сбой БД, должна быть возможность отправить сообщение пользователю. Итак, давайте посмотрим на этот код 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 ]

2 голосов
/ 18 ноября 2013

Я решил эту проблему, добавив один дополнительный шаг в каждый маршрутизатор, где я использую БД.

Это немного грязно, но работает и 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 Если вы знаете решение лучше, пожалуйста, дайте мне знать.

0 голосов
/ 22 февраля 2012

Надеюсь, я правильно понимаю ваш вопрос, я думаю, вы беспокоитесь об этом, потому что мангуста принимает оптимистичный шаблон и позволяет вам считать само собой разумеющимся, что он в конечном итоге подключится, вы боитесь, что не сможетеизящно обрабатывает случай, когда соединение не удается.

Метод Connection.open() принимает обратный вызов в качестве последнего аргумента.Этот обратный вызов будет вызываться с объектом Error в качестве аргумента, если соединение не может быть открыто.Из источника mongoose (порт и опции не обязательны):

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

В качестве альтернативы, вы можете подписаться на событие Connection «error».Он также получает объект ошибки в качестве аргумента.Тем не менее, он выдается только в том случае, если все аргументы (и состояние) являются действительными, в то время как обратный вызов вызывается каждый раз, даже если, например, что-то идет не так перед фактической попыткой соединения (например, соединение не находится в readyState),и даже если соединение установлено успешно (в этом случае аргумент ошибки равен нулю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...