You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用tunnel-ssh与Mongoose通过SSH连接MongoDB遇ConfigError问题

解决tunnel-ssh连接时的ConfigError: host not set问题

咱们来一步步拆解你遇到的这个问题,从配置细节到版本适配逐一排查:

1. 先确认环境变量是否正确加载

报错提示host not set,最直接的原因可能是process.env.SSH_SERVER没有读取到有效值,导致host字段为undefined

  • 先检查你的环境变量文件(比如.env)里是否确实写了SSH_SERVER=192.168.9.104
  • 如果使用dotenv管理环境变量,一定要在代码最顶部加载它,确保环境变量提前生效:
    import dotenv from 'dotenv';
    dotenv.config();
    
  • 可以在创建配置前加一行打印,验证变量值:
    console.log('SSH_SERVER:', process.env.SSH_SERVER); // 正常应该输出192.168.9.104
    const config = { ... };
    

2. 修正配置字段的拼写错误

你的config里有个明显的大小写问题:Password应该改为小写的password(tunnel-ssh的配置字段严格区分大小写)。虽然当前报错是host相关,但这个错误后续会导致SSH认证失败,先修正:

const config = {
  username: 'username',
  password: 'password', // 把大写P改成小写p
  host: process.env.SSH_SERVER,
  port: 22,
  dstHost: process.env.DESTINATION_SERVER,
  dstPort: process.env.DESTINATION_PORT,
  localHost: '127.0.0.1',
  localPort: 27017
};

3. 适配tunnel-ssh版本的配置结构

如果你的tunnel-ssh是v5及以上版本,配置结构和旧版本有差异,需要把SSH相关配置放到ssh对象,隧道配置放到tunnel对象里。尝试调整成以下结构:

const config = {
  ssh: {
    username: 'username',
    password: 'password',
    host: process.env.SSH_SERVER,
    port: 22
  },
  tunnel: {
    dstHost: process.env.DESTINATION_SERVER,
    dstPort: parseInt(process.env.DESTINATION_PORT), // 环境变量读出来是字符串,转成数字更稳妥
    localHost: '127.0.0.1',
    localPort: 27017
  }
};

4. 优化错误处理逻辑

当前代码里SSH连接出错后仍会尝试连接MongoDB,容易造成逻辑混乱。建议在SSH隧道成功建立后再执行DB连接,同时增加失败后的资源清理:

class DB {
  initDB() {
    tunnel(config, (error, server) => {
      if (error) {
        console.error('SSH connection error:', error);
        return; // 出错后直接返回,不再执行后续DB连接
      }
      console.log('SSH tunnel established successfully');
      
      const url = `mongodb://${process.env.MONGO_URL}`;
      mongoose.connect(url, { useNewUrlParser: true })
        .then(() => {
          console.log('DB connection successful');
        })
        .catch(dbError => {
          console.error('DB connection error:', dbError);
          server.close(); // DB连接失败时关闭SSH隧道,避免资源泄漏
        });
        
      mongoose.plugin(toJson);
      mongoose.plugin(setProperties);
    });
  }
}

按照上面的步骤逐一排查,应该就能解决host not set的问题了。

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

火山引擎 最新活动