【问题标题】:Using a mongo connection more than once returns Cannot use a session that has ended多次使用 mongo 连接返回无法使用已结束的会话
【发布时间】:2020-09-16 13:02:08
【问题描述】:

我在使用 Mongo 时遇到问题,请考虑:

const mongoose = require('mongoose');

const CONFIG = {
    host: "localhost",
    port: 27017,
    db: "dev"
};

const url = `mongodb://${CONFIG.host}:${CONFIG.port}/${CONFIG.db}`;
const options = {
    useNewUrlParser: true, 
    useUnifiedTopology: true, 
    useCreateIndex: true 
};

const checkMongoConnection = async () => {
    return new Promise(async (resolve, reject) => {
        if (mongoose.connection.readyState === 1) {
            return resolve();
        }

        try {
            await mongoose.connect(url, options);
            return resolve();
        } catch(error) {
            console.log(error);
            reject(error);
        }
    });
};

const disconnectMongo = async () => {
    return new Promise(async (resolve, reject) => {
        try {
            await mongoose.disconnect();
            return resolve();
        } catch(error) {
            console.log(error);
            reject(error);
        }
    });
};

module.exports = {
    checkMongoConnection,
    disconnectMongo
}

而我的数据库查询是这样的:

const User = require('./app/Models/User');
const { checkMongoConnection, disconnectMongo } = require(
    './app/util/mongo-connection-util'
);

const task1 = async () => {
    try {
        await checkMongoConnection();

        const user = await User
            .findOne()

            console.log(user._id);

        await disconnectMongo();
    } catch(error) {
        console.log(error);
    }
};

task1()
task1()

问题是,如果我使用task1 调用对数据库进行查询,然后立即再次查询,我会收到错误 Cannot use a session that has ended。如果我只是在没有问题的情况下调用该函数。

我知道这是因为连接已经在使用中,如果我使用await 并以串行方式执行功能,等待第一个完成后再执行下一个,代码将起作用。

但是我想在一组 API 调用之后进行数据库调用,所以它会在不同的时间异步。是否有可能实现这一点,还是所有数据库调用都必须一个接一个?

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    除非您有不同说明的文档,或者需要不同行为的明确用例,否则您应该为每个进程创建一次驱动程序的 MongoClient 对象,并在进程的整个生命周期中使用该对象。

    换句话说,删除所有断开 MongoClients 的代码。

    如果您想将 MongoClient 限定为操作,请使用官方文档中提供的模式,该模式不涉及全局存储客户端。

    【讨论】:

    • 我已经删除了断开连接代码,现在它可以工作了。但是,如果不使用断开连接,脚本会挂起并且永远不会终止。有没有办法解决这个问题?
    • 据我所知驱动文档中提供的代码没有这个问题。如果您使用的是 mongoose,则需要参考其文档以在脚本中正确使用它。
    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多