【问题标题】:Mongo throwing "Topology was destroyed" after one connectionMongo 在一次连接后抛出“拓扑被破坏”
【发布时间】:2017-05-04 18:32:20
【问题描述】:

我正在使用由 mLab 和 Node.js 托管的 MongoDB,以及 express 和 TypeScript。我的问题是,当我运行我的服务器时,我只能向数据库发出一个请求,并且任何后续请求都会抛出 “拓扑已破坏。”这是我的代码的样子。

export function getTeamName(id: string, callbackSuccess: (name) => void, callbackError?: (error) => void) {
    initDb(() => {
        db.collection('teams', (err: Error, teams) => {
            if (err) { callbackError(err); db.close(); return; }
            else {
                teams.findOne({ '_id': id }, { 'name': 1 }, (error, name) => {
                    if (error) { callbackError(error); db.close(); return; }
                    else { callbackSuccess(name); db.close(); }
                });
            }
        })
    }, (err) => {
        callbackError(err);
    })
}

还有initDb() 方法:

import { Server, Db } from 'mongodb'; //using mongodb typings
var server = new Server("*******.mlab.com", *****, { auto_reconnect: false });
var db = new Db('serverName', server, { w: 1 });
function initDb(callbackSuccess: (data) => void, callbackError?: (err) => void) {
    db.open((err, db) => {
        if (err) {
            callbackError(err);
        }
        else {
            db.authenticate("username", "password", (error, data) => {
                if (error) {
                    callbackError(err);
                }
                else {
                    callbackSuccess(data);
                }
            });
        }
    });
}

感谢您的帮助。

【问题讨论】:

  • “拓扑被破坏”通常意味着您的应用程序在关闭连接后尝试重新使用它。见stackoverflow.com/questions/30909492/…。您的应用程序的任何部分是否关闭了数据库连接?
  • 就是这样。我的网络有防火墙阻止连接到 mLab。

标签: node.js mongodb google-app-engine express typescript


【解决方案1】:

确保您的网络没有防火墙...这是我的问题。

【讨论】:

  • 这是一个旧答案,但我在放置一些文档时偶然发现了这一点。没有防火墙从来都不是一个好的建议。最好在防火墙上有正确的规则并允许预期和预期的通信
  • @akaphenom 绝对是一个好点。我在一个禁止 IP 隧道的学校网络上,因此连接到一个数据库。有时防火墙是我们无法控制的!
猜你喜欢
  • 2019-08-27
  • 2015-09-03
  • 2015-07-09
  • 2020-10-23
  • 2016-12-27
  • 2015-08-06
  • 1970-01-01
相关资源
最近更新 更多