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

如何使用Node.js建立到MongoDB数据库的SSH隧道连接,node.js,mongodb,ssh,mongoose,ssh-tunnel,Node.js,Mongodb,Ssh,Mongoose,Ssh Tunnel,我的凭证与Robomongo完美配合,但我无法与node.js建立连接 我尝试使用ssh2和隧道ssh npm模块建立连接,但两次都失败。 -mongo连接不需要密码 -ssh连接是使用pem密钥建立的 这是我在ssh2模块中使用的代码,我可以正确建立隧道,但mongo连接失败 var Client = require('ssh2').Client; var conn = new Client(); conn.on('ready', function() { console.log('

我的凭证与Robomongo完美配合,但我无法与node.js建立连接
我尝试使用ssh2和隧道ssh npm模块建立连接,但两次都失败。
-mongo连接不需要密码
-ssh连接是使用pem密钥建立的

这是我在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
});
以及隧道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);
        });

    });
});
我不确定在建立隧道或将数据库引用为localhost(如
mongodb://localhost:portnumber.

mongodb://databasepath.subpath.mongodbdns.com:27000


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

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


幸运的是,存在基于
ssh2
的第三方模块,为您提供此类功能,例如。尝试使用其中一个。

正如mscdex提到的,ssh2不是一个用于建立到数据库的ssh隧道连接的好模块。隧道ssh更合适

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

dstPort:远程数据库连接端口

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

用户名:SSH用户名

主机:SSH地址

DSTOST:数据库连接url(…mongodbns.com)

privateKey:SSH密钥

然后,一旦您的隧道被连接,通过mongoose连接到您的本地主机,例如mondodb://localhost:27000 (使用在localport中定义的localport)


您可以使用node的官方mongodb客户端来完成此操作

const sshTunnelConfig={
代理:process.env.SSH\u AUTH\u SOCK,
用户名:“ec2用户”,
privateKey:require('fs').readFileSync('./path-to-ec2-key.pem'),
主机:“3.98.174.12”,//作为SSH服务器的VPS的IP地址
港口:22,
DSTOST:'docdb-cluster-vmabwxueb51y.eu-central-1.docdb.amazonaws.com',
数码港:27017,
localHost:'127.0.0.1',
localPort:27018//或任何您想要的未使用的内容
};
常量connectionProperties={
sslValidate:正确,
是的,
sslCA:[fs.readFileSync('rds-combined-ca-bundle.pem'),
useNewUrlParser:true,
useUnifiedTopology:正确,
验证机制:“紧急停堆-SHA-1”,
认证:{
用户:“docdbuser”,
密码:“”
},
tlsAllowInvalidHostnames:true,
tlsAllowInvalidCertificates:true,
};
隧道(sshTunnelConfig,异步(错误,服务器)=>{
如果(错误){
log('SSH连接错误:',错误);
}
const MongoClient=require('mongodb')。MongoClient;
const client=MongoClient.connect('mongodb://localhost:27018/,财产联系,
功能(错误,客户端){
如果(错误)
犯错误;
//指定要使用的数据库
db=client.db('database-name');
//指定要使用的集合
col=db.collection(“collection-name”);
//插入单个文档
col.insertOne({'hello':'amazondocumentdb'},函数(err,result){
//查找以前编写的文档
col.findOne({'hello':'amazondocumentdb'},函数(err,result){
//将结果打印到屏幕上
控制台日志(结果);
//关闭连接
client.close()
});
});
});

});感谢您的响应我在隧道ssh上也花了很长时间,我无法连接,我的隧道ssh代码在上面。您是否在配置对象中尝试了
用户名
而不是
用户
?我收到此>>错误:所有配置的身份验证方法都失败注意:我正在使用require('mongodb')).MongoClient,require('tunnel-ssh'),var config={username:'root',Password:'xxxxxx',host:'x.x.11.130',dstHost:'x.x.11.130',端口:22,dstHost:url,dstPort:10945,localPort:10945};仅供参考,tunnel ssh在内部使用ssh2建立TunnelTank,供您共享该代码,但您确定该块工作正常吗?我试着做同样的事情。Ssh连接还可以,但之后,我无法连接mongo客户端。我尝试了您的示例代码,并且再次尝试了相同的代码。propertiesConnection与connectionProperties没有任何意义……这是否经过测试?
sshTunnelConfig
对象的属性似乎与的接口匹配。以下q/a在使其发挥作用时应该更有用:
var server = tunnel(config, function (error, server) {
    if(error){
        console.log("SSH connection error: " + error);
    }
    mongoose.connect('mongodb://localhost:27000/');
    //...rest of mongoose connection
}