【问题标题】:Every second run throws: MongoError: Topology was destroyed每秒运行一次抛出:MongoError:拓扑已破坏
【发布时间】:2019-08-27 12:06:36
【问题描述】:

我正在构建一个 REST API,但每次加载我的站点时,我都会收到 MongoError: Topology was destroyed。有人可以帮我解决这个问题吗?感觉异步运行有问题。

const client = new MongoClient(apiconfig.mongoUrl, {
    useNewUrlParser: true
});

app.get("/api/:object", (req, res) => {
    mongodb(req.params["object"], async (collection: Collection) => {
        if (collection !== undefined) {
            let result = await collection.find().toArray();
            res.send(result);
        }
        else {
            res.sendStatus(404);
        }
    });
});

const mongodb = (coll: string, operation: (collection: Collection) => Promise<void>) => {
    client.connect((err) => {
        const db = client.db("VaorraJS");
        db.collections().then((collections) => {
            operation(collections.find((collection) => collection.collectionName === coll)).then(() => {
                client.close();
            });
        }).catch((error) => {
            console.log("ERROR: " + error);
        });
    });
}

app.listen(5000);

【问题讨论】:

    标签: javascript node.js mongodb typescript express


    【解决方案1】:

    我建议使用Mongoose

    您正在为每个请求创建数据库连接,这不是正确的方法

    const MongoClient = require('mongodb').MongoClient;
    // Connection URL
    const url = 'mongodb://localhost:27017';
    
    // Database Name
    const dbName = '<some db>';
    
    // Use connect method to connect to the server
    let db;
    MongoClient.connect(url, function (err, client) {
        assert.equal(null, err);
        console.log("Connected successfully to server");
        db = client.db(dbName);
    });
    
    
    app.get("/api/:object", async(req, res) => {
        const collection = db.collection(req.params["object"]);
        let result = await collection.find().toArray();
        res.send(result);
    });
    

    【讨论】:

    • 但是连接不会在很长一段时间后超时吗?
    • @Koflin 你能分享一下你遇到了什么错误吗?
    • 感谢您修复了我的错误,但我仍然担心连接会在很长一段时间后超时。你觉得会吗?
    • 我不这么认为,如果服务器无法连接到数据库,就会发生超时。在此,除非 mongo 服务器关闭,否则我看不到任何问题。
    • Serverless 功能场景下如何解决同样的问题。无服务器调用本身就是实例,因此它们会创建连接,对吗?我在here 发布了类似的问题。
    猜你喜欢
    • 2015-09-03
    • 2015-07-09
    • 2020-10-23
    • 2016-12-27
    • 2017-05-04
    • 2021-04-30
    • 1970-01-01
    相关资源
    最近更新 更多