如何使用Node.js建立到MongoDB数据库的SSH隧道连接

时间:2016-07-21 16:47:49

标签: node.js mongodb ssh mongoose ssh-tunnel

我的凭据与Robomongo完美配合,但我无法与node.js建立联系 我试图使用ssh2和tunnel-ssh npm模块建立连接,但两次都失败了 - mongo连接不需要密码
- 使用pem键进行ssh连接

这是我和ssh2模块一起使用的代码,我可以正确建立隧道,但是mongo连接失败

var Client = require('ssh2').Client;

var conn = new Client();
conn.on('ready', function() {
    console.log('Client :: ready');
    //mongo connection
        mongoose.connect('mongodb://localhost:27000/');
        var db = mongoose.connection;
        db.on('error', console.error.bind(console, 'connection error:'));
        db.once('open', function() {
            console.log("database connection established");
            var users = db.collection('user');
            var getallUsers = function (date, callback){
                users.find({}).toArray(function(err,data){
                    callback(data);
                })
            };
            getallUsers(null, function (data){
                console.log('data :'+  data);
            });
        });
    //end of mongo connection
}).connect({
    host: '**.**.**.**.**',
    port: 22,
    username: 'ec2-user',
    privateKey: key
});

代码是tunnel-ssh

var config = {
    dstPort: 27000,
    user: 'ec2-user',
    host: '**.**.**.**.**',
    privateKey: key
};

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

    var db = mongoose.connection;

    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', function() {

        console.log("database connection established");

        var users = db.collection('user');
        var getallUsers = function (date, callback){
            users.find({}).toArray(function(err,data){
                callback(data);
            })
        };
        getallUsers(null, function (data){
            console.log(data);
        });

    });
});

我不确定在建立隧道后是否使用常规MongoDB连接字符串,或者将数据库称为localhost,例如
MongoDB的://本地主机:端口号
。 或
mongodb://databasepath.subpath.mongodbdns.com:27000

Localhost给了我一个权限被拒绝的错误,后者给了我一个超时

3 个答案:

答案 0 :(得分:3)

正如mscdex所提到的,ssh2并不是用来与数据库建立ssh隧道连接的好模块。 tunnel-ssh更合适。

以下是我使用过的配置选项:

dstPort:远程数据库连接端口

localPort:与dstPort相同,它将是您用于本地计算机的端口

用户名:SSH用户名,

主机:SSH地址

dstHost:数据库连接网址(... mongodbns.com),

privateKey:SSH密钥

然后连接隧道后,通过mongoose连接到本地主机,例如mondodb:// localhost:27000(使用你在localPort中定义的本地端口)

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

答案 1 :(得分:1)

您可以使用官方的mongodb客户端节点进行操作

f=4, u=1, n=1, c=3, t=1, i=1, o=1, n=1 == 13

答案 2 :(得分:0)

由于mongoose不支持传入流以用作底层连接,因此您必须侦听本地端口(例如27000)并通过ssh连接转发到该端口的传入连接。

幸运的是,存在构建在ssh2上的第三方模块,可为您提供此类功能,例如tunnel-ssh。尝试使用其中之一。