You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Node.js无需MongoDB凭据检测远程MongoDB服务状态?

无凭据检测远程MongoDB服务状态的可行方案

你的需求完全可行,不需要MongoDB凭据就能检测远程服务是否运行,以下是几种适合Node.js环境的方法:

1. TCP端口连通性检测

MongoDB默认监听27017端口,通过检测该端口是否能建立TCP连接,是最轻量化的基础检测方式。能快速判断端口是否开放、服务是否在监听状态(需注意防火墙规则可能影响结果)。

示例代码:

const net = require('net');

function checkMongoPort(host, port = 27017, timeout = 3000) {
  return new Promise((resolve) => {
    const socket = new net.Socket();
    socket.setTimeout(timeout);
    
    socket.on('connect', () => {
      socket.destroy();
      resolve({ status: 'up', host, port });
    });
    
    socket.on('timeout', () => {
      socket.destroy();
      resolve({ status: 'timeout', host, port });
    });
    
    socket.on('error', (err) => {
      socket.destroy();
      resolve({ status: 'down', host, port, error: err.message });
    });
    
    socket.connect(port, host);
  });
}

// 调用示例
checkMongoPort('server2')
  .then(console.log)
  .catch(console.error);

2. 无认证MongoDB握手检测

利用MongoDB的hello(旧版isMaster)命令特性:即使没有认证权限,只要服务运行,就会返回基础服务信息。这种方式比端口检测更准确,能直接确认MongoDB服务本身是否正常运行,而非仅端口开放。

示例代码(依赖mongodb驱动,需先安装:npm install mongodb):

const { MongoClient } = require('mongodb');

async function checkMongoService(host, port = 27017, timeout = 5000) {
  const uri = `mongodb://${host}:${port}/?authSource=admin&connectTimeoutMS=${timeout}`;
  let client;
  
  try {
    client = await MongoClient.connect(uri, {
      auth: { username: '', password: '' },
      directConnection: true // 直连单节点,适合检测独立实例
    });
    
    const adminDb = client.db('admin');
    const helloResult = await adminDb.command({ hello: 1 });
    
    return {
      status: 'up',
      host,
      port,
      mongoVersion: helloResult.version,
      note: 'Service is running'
    };
  } catch (err) {
    // 区分认证错误(服务运行但需权限)和连接错误(服务未启动)
    if (err.code === 18) {
      return { status: 'up', host, port, note: 'Service running but requires authentication' };
    } else {
      return { status: 'down', host, port, error: err.message };
    }
  } finally {
    if (client) await client.close();
  }
}

// 调用示例
checkMongoService('server3')
  .then(console.log)
  .catch(console.error);

3. 辅助:服务器存活检测(Ping)

通过ICMP Ping确认目标服务器是否在线,仅作为补充检测(很多服务器会禁用Ping,且无法直接对应MongoDB服务状态)。可使用ping模块实现:

const ping = require('ping');

async function checkServerAlive(host) {
  const res = await ping.promise.probe(host);
  return { host, alive: res.alive };
}

注意事项

  • 确保目标服务器的MongoDB配置允许来自server1的连接(如bindIp设置包含server1的IP,或设为0.0.0.0),同时防火墙开放27017端口。
  • 若目标MongoDB启用了IP白名单,需将server1的IP加入允许列表。

内容的提问来源于stack exchange,提问作者don huan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:10:27