node-mongodb-native: как я могу поделиться объектом db api обратного вызова соединения через мое приложение

В настоящее время я откатываюсь от мангуста к node-mongodb-native.

Так что я совсем новичок в этой теме. Однако в настоящее время моя проблема заключается в том, что я хочу создать коллекцию баз данных при запуске сервера, которую затем могу использовать через приложение. К сожалению, я нахожу в репозитории только примеры, в которых вы можете выполнять действия с базой данных непосредственно в обратном вызове функции подключения.

документы:

var mongodb = require("mongodb"),
    mongoServer = new mongodb.Server('localhost', 27017),
    dbConnector = new mongodb.Db('example', mongoServer);

db_connector.open(function(err, db) {
    if (err) throw new Error(err);

    // here I can do my queries etc.
});

Но как я могу получить доступ к объекту db в обратном вызове, когда я нахожусь в каком-то обратном вызове маршрута? В настоящее время единственная идея, которая у меня была бы, - это обернуть приложение в обратный вызов:

var mongodb = require("mongodb"),
    express = require("express"),
    mongoServer = new mongodb.Server('localhost', 27017),
    dbConnector = new mongodb.Db('example', mongoServer);

var app = new express();

db_connector.open(function(err, db) {
    if (err) throw new Error(err);

    app.get('/products', function(req, res, next) {
        db.collection('products', function(err, collection) {
            if (err) next(new Error(err));
            collection.find({}, function(err, products) {
                res.send(products);
            });
        });
    });

});

Но я не думаю, что это так, как должно было быть?

Разве нет способа создать вызов подключения к базе данных синхронизации, который затем я могу легко использовать во всем приложении, как это было с мангустом?

С уважением бодо


person bodokaiser    schedule 13.12.2012    source источник


Ответы (1)


Db.open открывает соединение с mongodb и возвращает ссылку на себя. Исходный код см. здесь: https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/db.js#L245

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

Итак, что вы можете сделать, это:

var mongodb = require("mongodb"),
    express = require("express"),
    mongoServer = new mongodb.Server('localhost', 27017),
    dbConnector = new mongodb.Db('example', mongoServer),
    db;

var app = new express();

app.get('/products', function(req, res, next) {
  db.collection('products', function(err, collection) {
    if (err) next(new Error(err));
    collection.find({}, function(err, products) {
      res.send(products);
    });
  });
});

db_connector.open(function(err, opendb) {
  if (err) throw new Error(err);
  db = opendb;
  app.listen(3000);
});

В чем я не уверен, так это в том, что это хорошая идея. Это решение не позволяет вам воссоздать соединение, если произошел разрыв соединения или вы перезапустили процесс mongodb. Поэтому, хотя приведенное выше может работать, лучше создать метод, который будет обертывать создание соединения с mongodb.

person AndyD    schedule 13.12.2012
comment
привет, я думаю, что это правильный способ сделать. Я также нашел пример, который работает в этом направлении: github .com/mongodb/node-mongodb-native/blob/master/examples/ - person bodokaiser; 13.12.2012