检查猫鼬连接状态而不创建新连接

Posted

技术标签:

【中文标题】检查猫鼬连接状态而不创建新连接【英文标题】:Check mongoose connection state without creating new connection 【发布时间】:2013-11-05 03:27:57 【问题描述】:

我有一些测试 - 即 Supertest - 加载我的 Express 应用程序。这个应用程序创建了一个 Mongoose 连接。我想知道如何从我的测试中检查该连接的状态。

在 app.js 中

mongoose.connect(...)

在 test.js 中

console.log(mongoose.connection.readyState);

如何访问 app.js 连接?如果我在 test.js 中使用相同的参数进行连接,会创建一个新连接还是查找现有连接?

【问题讨论】:

两个脚本是相互独立运行还是app.js需要test.js? @Bernhard test.js 需要 app.js - 在 app.js 我做 var app = exports.app = express() 并且在测试我做 require('../app.js' ).app 【参考方案1】:

由于 mongoose 模块导出一个单例对象,因此您不必在 test.js 中进行连接来检查连接状态:

// test.js
require('./app.js'); // which executes 'mongoose.connect()'

var mongoose = require('mongoose');
console.log(mongoose.connection.readyState);

就绪状态:

0:断开连接 1:已连接 2:连接 3:断开连接

【讨论】:

输出 - 0 = 断开连接,1 = 连接,2 = 连接,3 = 断开连接 (soucre) 我的凭据无效,它给出了 4,我在官方文档或其他任何地方都找不到. @AshwaniAgarwal 查看this file。 如果 MongoDB 停止/崩溃,状态仍然保持不变。在我的情况下,如果连接时为 1,并且如果 mongo 停止,它仍在打印 1。 @RaviKumarGupta 可能需要(相当)一段时间才能让 Mongoose 知道连接已断开。 @robertklep,我是这么认为的。在 mongo 关闭后,我尝试打印就绪状态。即使在 5 分钟后,我仍然可以看到 readyState 值为 1.. :(【参考方案2】:

我将它用于我的 Express Server mongoDB 状态,我使用 express-healthcheck 中间件

// Define server status
const mongoose = require('mongoose');
const serverStatus = () => 
  return  
     state: 'up', 
     dbState: mongoose.STATES[mongoose.connection.readyState] 
  
;
//  Plug into middleware.
api.use('/api/uptime', require('express-healthcheck')(
  healthy: serverStatus
));

在连接数据库时在 Postman 请求中提供此信息。


  "state": "up",
  "dbState": "connected"

当数据库关闭时给出这个响应。


"state": "up",
"dbState": "disconnected"

(响应中的“up”代表我的 Express Server 状态)

易于阅读(无需解释数字)

【讨论】:

【参考方案3】:

如前所述,“readyState”很好。 “ping”也是很好的管理工具。如果它可以接受命令,它将返回 ok: 1 。

const mongoose = require('mongoose')

// From where ever your making your connection
const connection = await mongoose.createConnection(
    CONNECT_URI,
    CONNECT_OPTS
)

async function connectionIsUp(): Promise<boolean> 
    try 
        const adminUtil = connection.db.admin()

        const result = await adminUtil.ping()

        console.log('result: ', result) //  ok: 1 
        return !!result?.ok === 1
     catch(err) 
        return false
        
 

或者如果你想要它简短。

async function connectionIsUp(): Promise<boolean> 
    try 
        return await connection.db.admin().ping().then(res => !!res?.ok === 1)
     catch (err) 
        return false
    

【讨论】:

!!result?.ok === 1 的语法是什么?您能否提供该语法的文档链接? readyState 文档:mongoosejs.com/docs/api.html#connection_Connection-readyState【参考方案4】:
var dbState = [
    value: 0,
    label: "disconnected"
,

    value: 1,
    label: "connected"
,

    value: 2,
    label: "connecting"
,

    value: 3,
    label: "disconnecting"
];

mongoose.connect(CONNECTIONSTRING, 
    useNewUrlParser: true
,
() => 
    const state = Number(mongoose.connection.readyState);
    console.log(dbState.find(f => f.value == state).label, "to db"); // connected to db
);

【讨论】:

以上是关于检查猫鼬连接状态而不创建新连接的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 检查 Internet 连接状态

为啥当我尝试检查套接字连接状态时应用程序崩溃?

远程检查 IP 端口状态

使用连接池后返回连接时如何检查连接是不是处于活动状态?

EventSource 在第一条消息后断开连接

检查 Android 中的 *** 连接是不是处于活动状态?