代码之家  ›  专栏  ›  技术社区  ›  Fez Vrasta

同步连接到mongodb

  •  37
  • Fez Vrasta  · 技术社区  · 12 年前

    我希望首先连接到mongodb,然后运行应用程序中的所有其他内容。

    要做到这一点,我必须写一些东西,比如:

    MongoClient.connect("mongodb://localhost/test", function(err, connection) {
        if (err) { console.error(err); }
        db = connection;
    
        var app = express();
    
        // Include API V1
        require("./apiv1.js")(app, db);
    
        app.listen(3000, function(err) {
            if (err) { console.error(err); } else { console.log("Started on *:3000"); }
        });
    });
    

    这使得我的应用程序在.connect函数中完全缩进。。。这看起来很难看,而且在我做项目时会占用空间。

    我认为最好的解决方案是让MongoDB连接同步(即使没有DB连接,我的应用程序也无法正常工作,所以我为什么要在它连接时做些什么?)然后运行我的其余代码。

    我该怎么做?

    4 回复  |  直到 12 年前
        1
  •  33
  •   Leonid Beschastny Dmitry Chirkin    12 年前

    您无法同步连接到MongoDB,但您可以从代码中消除这种丑陋的回调。

    最好的方法是采用一些包装 node-mongodb-native driver .

    查看以下模块。


    mongojs

    var mongojs = require('mongojs');
    var db = mongojs('localhost/test');
    var mycollection = db.collection('mycollection');
    

    mongoskin

    var mongo = require('mongoskin');
    var db = mongo.db("mongodb://localhost:27017/test", {native_parser:true});
    

    monk

    var monk = require('monk');
    var db = monk('localhost/test');
    var users = db.get('users')
    

    当然,在内部,它们都在异步地建立MongoDB连接。

        2
  •  3
  •   cillierscharl Christian    12 年前

    使用 async 图书馆,你可以解决其中的一些问题。

    例如,在服务器启动时,我执行以下操作:

    async.series([
        function(callback){
            // Initialize the mongodb connection and callback on completion in init.
            db.init(function(){
                callback();
            });
        },
        function(callback){
            // Listen on requests etc.
            webServer.init(function(){
                callback();    
            });
        },
        function(callback){
            // Set up anything else that I need
            callback();
        }
    ]);
    
        3
  •  0
  •   Proteo5    9 年前

    如果您使用的是Node 6和更高版本,可以执行以下操作:

    const MongoClient = require('mongodb').MongoClient;
    const url = 'mongodb://localhost:27017/mydb';
    let db = null;
    getdb();
    
    //your code
    
    async function getdb() {
         db = await MongoClient.connect(url);
    }
    
    1. 带上mongodb库。
    2. 声明url常量。
    3. 将变量db声明为null。
    4. 调用getdb函数。
    5. 创建启动异步字的getdb函数
    6. 将带有关键字await的连接结果分配给db变量。
        4
  •  0
  •   lee shin    8 年前

    你可以用 thunky ,thunky执行一次异步函数并缓存它,随后的调用将从缓存返回。

    const MongoClient = require('mongodb').MongoClient;
    const thunky = require('thunky');
    
    var connect = thunky(function(cb){
     let url = 'mongodb://localhost:27017/test';
     MongoClient.connect(url, function(err, client){
        console.log('connecting')
        cb(err, client);
     })
    })
    
    connect( (err, client) => {
      console.log('connection 1')
    })
    
    connect( (err, client) => {
      console.log('connection 2')
    })
    
    connect( (err, client) => {
      console.log('connection 3')
      console.log('closing')
      client.close();
    })
    

    *注意:我使用的是最新的3.x mongodb驱动程序