Mongoose: как получить данные из закрытой коллекции в приложении express.js?

Я хотел бы прослушать ограниченную коллекцию MongoDB, используя ее как средство ведения журнала.
Я использую node, express.js, mongo (с mongoose).

Это (упрощенный) код, с которым я работаю до сих пор:

var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/mydb');

var logSchema = new mongoose.Schema({
  date: Date,
  message: String
}, {
  capped: {
    size: 1024
  }
});
var Log = mongoose.model('Log', logSchema);

var filter = { "date": { "$gte": Date.now() } };
var stream = Log.find(filter).tailable().stream();
stream.on('data', function(doc) {
  console.log('log stream data - new doc:', doc.message);
}).on('error', function (error) {
  console.log('status stream data - error:', error.message);
}).on('close', function () {
  console.log('status stream data - closed');
});

// ...

var log = new Log();
logger = function(message) {
  log.date = new Date();
  log.message = message;
  log.save(function(err) {
    if (err) {
      return console.error('error saving log');
    }
    console.log('log message "' + message + '" added');
  });
};

// ...

myRoutingMethod = function(req, res) {
  logger('my routing method started');
  // ...
  res.json('done');
});

Моя проблема в том, что перед вызовом myRoutingMethod() я получаю:

database connection opened
log message "my new message" added
status stream data - error: No more documents in tailed cursor
status stream data - closed

Итак, я никогда не получаю

log stream data - new doc: my new message

Я наверное что-то упускаю из-за интеграции stream() на крышке Log коллекция с express.js...

Любая подсказка?

1 ответ

Решение

Я не вижу ничего плохого в вашем коде, но на основе других ответов здесь на SO:

  1. Проверьте вашу версию Mongoose(>2.7)
  2. Попробуйте удалить коллекцию, если перед обновлением этого кода эта коллекция находилась в режиме без ограничения.
  3. на основании инициализации других, я бы предложил

var logSchema = mongoose.Schema({...}, {capped:{size: 1024, max: 1000, autoIndexId: true} }); module.exports = mongoose.model('Log', logSchema);

  1. Для инициализации и использования вашего Mongoose:

    var Log = require(path/to/log/schema); var stream = Log.find({}).tailable().stream(); stream.on('data', function(doc){}); stream.on('error', function(error){}); stream.on('close', function(status){});

  2. Для сохранения | редактирования используйте тот же подход, что и: новый журнал (params).save(fn(){})

также посмотрите на этот SO ответ: /questions/33918125/mongoose-querystream-novyie-rezultatyi/33918140#33918140

Другие вопросы по тегам