mongodb node.js客户端,连接挂起

时间:2014-02-18 08:48:20

标签: javascript node.js mongodb

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

2 个答案:

答案 0 :(得分:0)

问这个问题已经有很长时间了,但是对于那些希望使用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!

您将不会再得到任何命令行提示符。

最后,请记住关闭数据库连接,一切都会顺利进行!

答案 1 :(得分:0)

对于面临类似问题的其他任何人,我所要做的就是添加一个.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;