【问题标题】:mongodb node.js client, connect hangsmongodb node.js 客户端,连接挂起
【发布时间】:2014-03-17 21:21:18
【问题描述】:

node-mongodb-native node.js 客户端在MongoClient.connect(...) 时挂起,但mongodb-client (shell command line) 在终端上工作。有什么线索吗?

var MongoClient = require('mongodb').MongoClient;

MongoClient.connect(
    'mongodb://my.mongo.db.server.ip:27017/test',
     function(err, db) {

        if(err) throw err;
        console.log("shows during connect call back");

        });

// When load into node shell, it hangs forever

【问题讨论】:

  • 使用猫鼬 nodejs 客户端。像魅力一样工作。
  • 谢谢,但据说猫鼬得到ODM。是不是有点矫枉过正?
  • 我不会认为它是一种矫枉过正,因为它提供了结构化数据等好处,为您的数据提供了明确的模型等。通过所有这些功能,它保持了 MongoDb 必须为我们提供的灵活性。
  • 好吧,我建议mongojs 库,它更像是本机驱动程序上的瘦包装器。这并不强制你使用 NoSQL 试图避免的预定义结构。
  • 刚刚试过mongojsmongoosemongojs本身就是mongodb,界面不错。

标签: javascript node.js mongodb


【解决方案1】:

对于面临类似问题的其他人,我所要做的就是添加一个.catch,然后它就可以正常工作了:

const mongodb = require("mongodb");

const connectDb = mongodb.MongoClient.connect(process.env.MONGO_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true
}).catch(err =>
    res.status(400).json({ msg: `Could not connect to MongoDB`, err })
);

module.exports = connectDb;

【讨论】:

    【解决方案2】:

    这个问题已经很久没有问过了,但我会为那些希望使用 mongodb 而不是 mongoosemongojs 的人发布答案(在撰写本文时 mongojs 取决于mongodb 驱动程序的旧版本不安全)。

    TL;DR 版本

    程序正常执行,但添加db.close();行将允许您的程序正常终止:

    var MongoClient = require('mongodb').MongoClient;
    
    MongoClient.connect(
        'mongodb://my.mongo.db.server.ip:27017/test',
         function(err, db) {
            if(err) throw err;
            console.log("shows during connect call back");
            db.close(); //call this when you are done.
            });
    
    

    为什么使用mongodb.connect()时节点会出现挂起

    正如this answer 中所解释的,当节点有回调等待事件时,它不会退出。

    在这种情况下,connect() 注册一个回调,等待事件'close' 发出,表示所有数据库连接都已关闭。这就是为什么除非你打电话给db.close(),否则你的脚本会挂起。但是请注意,您的代码将执行的所有内容,您的程序都不会正常终止

    一个例子

    为了演示,如果您将以下代码块放入名为connect.js的文件中...

    const MongoClient = require('mongodb').MongoClient;
    async function dbconnect() {
    console.log("This will print.");
    
    const db = await MongoClient.connect(
        'mongodb://my.mongo.db.server.ip:27017/test');
    
    console.log("This will print too!");
    

    并在终端中执行它...

    $ node connect.js
    

    结果将是:

    $ node connect.js
    This will print.
    This will print too!
    
    

    您将不会再收到命令行提示。

    最后记得关闭你的数据库连接,一切都会好起来的!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多