如何使用Node.js建立到MongoDB数据库的SSH隧道连接
我的凭证与Robomongo完美配合,但我无法与node.js建立连接如何使用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('
我尝试使用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
}