我有一些测试——即 Supertest——加载我的 Express 应用程序。这个应用程序创建了一个 Mongoose 连接。我想知道如何从我的测试中检查该连接的状态。
在 app.js 中
mongoose.connect(...)
在 test.js 中
console.log(mongoose.connection.readyState);
如何访问 app.js 连接?如果我在 test.js 中使用相同的参数进行连接,会创建一个新连接还是查找现有连接?
由于 mongoose 模块导出一个单例对象,因此您不必在您的连接中test.js
检查连接状态:
// test.js
require('./app.js'); // which executes 'mongoose.connect()'
var mongoose = require('mongoose');
console.log(mongoose.connection.readyState);
就绪状态是:
我将它用于我的 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
}));
当数据库连接时,在邮递员请求中给出这个。
{
"state": "up",
"dbState": "connected"
}
当数据库关闭时给出这个响应。
{
"state": "up",
"dbState": "disconnected"
}
(回复中的“up”代表我的 Express Server 状态)
易于阅读(无需解释数字)
如前所述,“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
}
}
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
});