MongoDB Node.js客户端,连接卡住了。

8

node-mongodb-native 当使用 MongoClient.connect(...) 时,node.js客户端会挂起,但终端上的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

1
使用Mongoose Node.js客户端。非常好用。 - V31
我不认为这是过度设计,因为它提供了结构化数据、为数据定义明确的模型等诸多好处。在拥有所有这些功能的同时,它还保持了MongoDb所提供的灵活性。 - V31
3
我建议使用mongojs库,它更像是本机驱动程序的薄封装。这不会强制你使用预定义的结构,这也是NoSQL试图避免的。 - Risto Novik
刚试用了 mongojsmongoosemongojs 的接口和 mongodb 本身一样,非常好用。 - Andrew_1510
但回到你的问题,你所说的“挂起”是什么意思?如果你执行脚本,它没有结束?如果是的话,那很可能是因为 MongoDB 的连接没有关闭。你需要关闭它。 - Risto Novik
显示剩余4条评论
2个回答

5

虽然这个问题已经被问了很久,但我会为那些希望使用 mongodb 而不是 mongoose 或者 mongojs 的人发表回答(在撰写本文时,mongojs 依赖于较旧并且不安全的 mongodb 驱动程序)。

简化版

程序正常执行,但是添加一行代码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()时Node会出现卡顿的情况

正如这个答案所解释的那样,当Node等待事件回调时,它不会退出。

在这种情况下,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
太棒了!非常感谢您清晰详细的分享。 - Nam G VU
MongoClient.connect 的返回类型是 MongoClient,因此应该称其为 client 或 mongoClient,而不是 db。将其称为 db 会造成困惑,因为仍然需要调用 .db('foo') 来获取实际的数据库。 - sezanzeb

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;


1
还需要调用 .close() 方法来关闭连接。 - Nam G VU

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接