我有一些测试 - 即Supertest - 加载我的Express应用程序。这个应用程序创建一个Mongoose连接。我想知道如何从我的测试中检查该连接的状态。
在app.js
mongoose.connect(...)
在test.js
中console.log(mongoose.connection.readyState);
如何访问app.js连接?如果我在test.js中使用相同的参数进行连接,那么会创建一个新连接还是查找现有连接?
答案 0 :(得分:102)
由于mongoose模块导出单个对象,因此您无需在test.js
中连接以检查连接状态:
// test.js
require('./app.js'); // which executes 'mongoose.connect()'
var mongoose = require('mongoose');
console.log(mongoose.connection.readyState);
准备状态:
答案 1 :(得分:2)
如前所述,“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
}
}
答案 2 :(得分:0)
我将其用于Express Server mongoDB状态,在这里我使用express-healthcheck中间件
thing = {:items => [
{:id => 1},
{:id => 2},
{:id => 3}
]}
thing[:items] = thing[:items].append({:id => 4}) # adding a new item
thing[:items] = thing[:items].select { |item| item[:id] != 2 } # removing an item
连接数据库后,在邮递员请求中提供此功能。
// 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"
}
(响应中的“ up”代表我的Express Server状态)
易于阅读(无需数字解释)