簡體   English   中英

mongodb node.js 客戶端,連接掛起

[英]mongodb node.js client, connect hangs

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

這是一個很長的時間,因為這個問題已經被問過,但我會后回答為那些希望使用那些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()時出現掛起

本答案中所述,當節點有等待事件的回調時,它不會退出。

在這種情況下, 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!

您將不會收到進一步的命令行提示。

總之記得關閉你的數據庫連接,一切都會好起來的!

對於面臨類似問題的任何其他人,我所要做的就是添加一個.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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM