2016-12-01 255 views
2

我有两个Mongo数据库。一个是我的开发环境,一个生产这里从我Robomongo安装看出:Node.js使用Mongoose到MongoDB的SSH隧道

Two Mongo DBs

生产DB是SSH隧道到我的数字海洋虚拟服务器在这里看到(细节有了明显改变)。连接时,此设置工作正常/从我制作的网站:

SSH Tunnel Settings

我现在的工作在不同的/相关的项目,需要我本地机器连接到我的生产 DB,所以我认为我需要使用类似tunnel-ssh的东西来完成它。我以this answer为例,但是我要么Error: (SSH) Channel open failure: open failed要么连接到我的Dev数据库(当我使用27017作为我的dstHost/dstPort/localPort时)。我必须考虑这个错误,否则我对我的配置感到哑巴。无可否认,我是一个完全的Mongo/Mongoose新手,所以两者同样可行。有什么建议?

var fs = require("fs"); 
var mongoose = require('mongoose'); 
var tunnel = require('tunnel-ssh'); 

//===== db connection ===== 

var config = { 
    username:'my.username', 
    host:'my.ip.address', 
    agent : process.env.SSH_AUTH_SOCK, 
    privateKey:require('fs').readFileSync('/Users/myusername/.ssh/id_rsa'), 
    port:22, 
    dstHost:'mongodb://localhost:27000/mydbname', 
    dstPort:27000, 
    localHost:'127.0.0.1', 
    password:'mypassword', 
    localPort: 27000 
}; 

var server = tunnel(config, function (error, server) { 
    if(error){ 
     console.log("SSH connection error: " + error); 
    } 
    mongoose.connect('mongodb://localhost:27000/mydbname'); 

    var db = mongoose.connection; 
    db.on('error', console.error.bind(console, 'DB connection error:')); 
    db.once('open', function() { 
     // we're connected! 
     console.log("DB connection successful"); 
     // console.log(server); 
    }); 
}); 

在此先感谢!

回答

2

dstHost需要是主机名/ IP,而不是MongoDB连接字符串。在这种情况下,您可以在此特定情况下实际省略dstHostlocalHostlocalPort,因为它们已默认为您提供的值。

+0

好吧,至少进展。评论这三个,现在我得到'错误:(SSH)频道开放失败:连接被拒绝。对你来说意味着什么?关我进入Google机器... – jeremytripp

+1

您没有使用与您在屏幕截图中显示的端口相同的端口。因此请尝试相应地改变它以匹配。您还需要更改连接字符串中的端口。 – mscdex

+0

这是票。在今天上午阅读你的评论之后5秒内痛苦地显而易见并得到修复。非常感谢! – jeremytripp

3

未来参考的最终工作配置。感谢mscdex - 我只需提供正确的 dstPort并将其包含在我的Mongo URI字符串(27017)中。很简单。希望这可以帮助。

var config = { 
    username:'myusername', 
    host:'my.ip.address', 
    agent : process.env.SSH_AUTH_SOCK, 
    privateKey:require('fs').readFileSync('/Users/myusername/.ssh/id_rsa'), 
    port:22, 
    dstPort:27017, 
    password:'mypassword' 
}; 

var server = tunnel(config, function (error, server) { 
    if(error){ 
     console.log("SSH connection error: " + error); 
    } 
    mongoose.connect('mongodb://localhost:27017/mydbname'); 

    var db = mongoose.connection; 
    db.on('error', console.error.bind(console, 'DB connection error:')); 
    db.once('open', function() { 
     // we're connected! 
     console.log("DB connection successful"); 
    }); 
}); 
+0

嗨我已经尝试过您的解决方案,它非常有帮助,但我不得不添加密码才能使其正常工作。非常感谢你 :) – Yoga