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
答案 0 :(得分:0)
问这个问题已经有很长时间了,但是对于那些希望使用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()
时节点似乎挂起如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;