【问题标题】:Connect synchronously to mongodb同步连接mongodb
【发布时间】:2014-11-12 13:25:17
【问题描述】:

我想先连接到 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 连接同步(即使没有数据库连接,我的应用程序也无法运行,为什么我要在连接时执行某些操作?),然后运行我的其余代码。

我该怎么办?

【问题讨论】:

  • 这就是 node.js 的工作方式。一切都是异步的和回调的。你无法改变这一点,但我记得读过一些有助于减少代码意大利面的库。不幸的是,我不记得名字了。
  • “最好的解决方案是让 MongoDB 连接同步” - 例如,您可以使用 ruby​​。
  • 是的,您的应用程序包含在 .connect() 方法中,但是您将所有逻辑导出到另一个文件中(这是个好主意),我在这里看不到任何丑陋的东西。
  • 你可能想看看koa,它使代码看起来更干净(以大量使用 ES6 生成器函数为代价)。
  • 您可以使用mongoose,它具有 IMO 一个很棒的功能,如果您尝试保存某些内容,它会等到建立连接,然后在幕后保存数据!

标签: node.js mongodb


【解决方案1】:

你不能同步连接到 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连接的。

【讨论】:

  • 嘿 mongoskin 太棒了!谢谢^_^
  • @FezVrasta 我个人更喜欢monk,但它们都很棒。 =)
  • 嗯,mongoskin 让我无需更改所有代码即可插入它,这是一个不错的 +1 模块
  • 2019年来到这里,和尚依然活跃,先尝试一下。
【解决方案2】:

使用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】:

如果您使用的是 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】:

你可以用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 驱动程序

【讨论】:

    猜你喜欢
    • 2016-09-05
    • 1970-01-01
    • 2018-10-31
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2015-08-14
    相关资源
    最近更新 更多