GVKun编程网logo

如何使用Node.js建立与MongoDB数据库的SSH隧道连接(nodejs链接mongodb)

11

这篇文章主要围绕如何使用Node.js建立与MongoDB数据库的SSH隧道连接和nodejs链接mongodb展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何使用Node.js建立与Mong

这篇文章主要围绕如何使用Node.js建立与MongoDB数据库的SSH隧道连接nodejs链接mongodb展开,旨在为您提供一份详细的参考资料。我们将全面介绍如何使用Node.js建立与MongoDB数据库的SSH隧道连接的优缺点,解答nodejs链接mongodb的相关问题,同时也会为您带来java jdbc使用SSH隧道连接mysql数据库demo、node.js – 如何使用MongoLab在Heroku上设置MongoDB数据库?、node.js – 如何使用mongoose动态连接多个mongodb数据库?、node.js – 如何使用NodeJS以超级用户身份连接到另一个MongoDB数据库?的实用方法。

本文目录一览:

如何使用Node.js建立与MongoDB数据库的SSH隧道连接(nodejs链接mongodb)

如何使用Node.js建立与MongoDB数据库的SSH隧道连接(nodejs链接mongodb)

我的凭据与Robomongo完美搭配,但无法与node.js建立连接,
我尝试使用ssh2和tunnel-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);        });    });});

我不确定在建立隧道之后是使用常规的MongoDB连接字符串还是将数据库引用为localhost,例如
mongodb:// localhost:portnumber。

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

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

答案1

小编典典

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

这是我使用的配置选项:

dstPort:远程数据库连接端口

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

用户名:SSH用户名,

主机:SSH地址

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

privateKey:SSH密钥

然后,一旦您的隧道连接,通过猫鼬连接到您的本地主机,例如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}

java jdbc使用SSH隧道连接mysql数据库demo

java jdbc使用SSH隧道连接mysql数据库demo

java jdbc使用SSH隧道连接mysql数据库demo

 
本文链接: https://blog.csdn.net/earbao/article/details/50216999
  1.  
    package com.yws.echo_socket;
  2.  
     
  3.  
     
  4.  
    import com.jcraft.jsch.JSch;
  5.  
    import com.jcraft.jsch.Session;
  6.  
     
  7.  
    import java.sql.*;
  8.  
     
  9.  
    //http://my.oschina.net/Thinkeryjgfn/blog/177283
  10.  
    //http://www.cnblogs.com/I-will-be-different/p/3925351.html?utm_source=tuicool&utm_medium=referral
  11.  
    //java jdbc使用SSH隧道连接mysql数据库demo
  12.  
    public class ChangeDB {
  13.  
     
  14.  
     
  15.  
     
  16.  
    public static void go() {
  17.  
    try {
  18.  
    JSch jsch = new JSch();
  19.  
    Session session = jsch.getSession( "yunshouhu", "192.168.0.102", 22);
  20.  
    session.setPassword( "xxxx");
  21.  
    session.setConfig( "StrictHostKeyChecking", "no");
  22.  
    session.connect();
  23.  
    System.out.println(session.getServerVersion()); //这里打印SSH服务器版本信息
  24.  
     
  25.  
    //ssh -L 192.168.0.102:5555:192.168.0.101:3306 yunshouhu@192.168.0.102 正向代理
  26.  
    int assinged_port = session.setPortForwardingL("192.168.0.101",5555, "192.168.0.101", 3306);//端口映射 转发
  27.  
     
  28.  
    System.out.println( "localhost:" + assinged_port);
  29.  
     
  30.  
    //ssh -R 192.168.0.102:5555:192.168.0.101:3306 yunshouhu@192.168.0.102
  31.  
    //session.setPortForwardingR("192.168.0.102",5555, "192.168.0.101", 3306);
  32.  
    // System.out.println("localhost: -> ");
  33.  
    } catch (Exception e) {
  34.  
    e.printStackTrace();
  35.  
    }
  36.  
    }
  37.  
     
  38.  
     
  39.  
     
  40.  
    public static void main(String[] args) {
  41.  
     
  42.  
     
  43.  
    try {
  44.  
    //1、加载驱动
  45.  
    Class.forName( "com.mysql.jdbc.Driver");
  46.  
    } catch (ClassNotFoundException e) {
  47.  
    e.printStackTrace();
  48.  
    }
  49.  
    //2、创建连接
  50.  
    Connection conn = null;
  51.  
    Connection conn2 = null;
  52.  
    try {
  53.  
     
  54.  
    conn2 = DriverManager.getConnection( "jdbc:mysql://localhost:3306/mysql", "hadoop", "xxxx");
  55.  
    getData(conn2);
  56.  
    } catch (SQLException e) {
  57.  
    System.out.println( "未连接上数据库");
  58.  
    e.printStackTrace();
  59.  
    }
  60.  
     
  61.  
    try{
  62.  
    System.out.println( "=============");
  63.  
    go();
  64.  
    conn = DriverManager.getConnection( "jdbc:mysql://192.168.0.101:5555/mysql", "hadoop", "xxx");
  65.  
    getData(conn);
  66.  
     
  67.  
     
  68.  
    } catch (SQLException e) {
  69.  
    e.printStackTrace();
  70.  
    }
  71.  
     
  72.  
     
  73.  
     
  74.  
    }
  75.  
     
  76.  
    private static void getData(Connection conn) throws SQLException {
  77.  
     
  78.  
    // 获取所有表名
  79.  
    Statement statement = conn.createStatement();
  80.  
    ResultSet resultSet = statement
  81.  
    .executeQuery( "select * from help_keyword");
  82.  
    // 获取列名
  83.  
    ResultSetMetaData metaData = resultSet.getMetaData();
  84.  
    for (int i = 0; i < metaData.getColumnCount(); i++) {
  85.  
    // resultSet数据下标从1开始
  86.  
    String columnName = metaData.getColumnName(i + 1);
  87.  
    int type = metaData.getColumnType(i + 1);
  88.  
    if (Types.INTEGER == type) {
  89.  
    // int
  90.  
    } else if (Types.VARCHAR == type) {
  91.  
    // String
  92.  
    }
  93.  
    System.out.print(columnName + "\t");
  94.  
    }
  95.  
    System.out.println();
  96.  
    // 获取数据
  97.  
    while (resultSet.next()) {
  98.  
    for (int i = 0; i < metaData.getColumnCount(); i++) {
  99.  
    // resultSet数据下标从1开始
  100.  
    System.out.print(resultSet.getString(i + 1) + "\t");
  101.  
    }
  102.  
    System.out.println();
  103.  
     
  104.  
    }
  105.  
    statement.close();
  106.  
    conn.close();
  107.  
    }
  108.  
     
  109.  
    }

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.  
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.  
    <parent>
  6.  
    <artifactId>grpc-demo</artifactId>
  7.  
    <groupId>org.jiepu</groupId>
  8.  
    <version>1.0</version>
  9.  
    </parent>
  10.  
    <modelVersion>4.0.0</modelVersion>
  11.  
     
  12.  
    <artifactId>echo_socket</artifactId>
  13.  
     
  14.  
    <properties>
  15.  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  16.  
    <java.version>1.6</java.version>
  17.  
    </properties>
  18.  
     
  19.  
    <dependencies>
  20.  
     
  21.  
    <dependency>
  22.  
    <groupId>com.jcraft</groupId>
  23.  
    <artifactId>jsch</artifactId>
  24.  
    <version>0.1.53</version>
  25.  
    </dependency>
  26.  
    <dependency>
  27.  
    <groupId>mysql</groupId>
  28.  
    <artifactId>mysql-connector-java</artifactId>
  29.  
    <version>5.1.36</version>
  30.  
    </dependency>
  31.  
    </dependencies>
  32.  
    <build>
  33.  
    <plugins>
  34.  
    <plugin>
  35.  
    <groupId>org.apache.maven.plugins</groupId>
  36.  
    <artifactId>maven-compiler-plugin</artifactId>
  37.  
    <configuration>
  38.  
    <source>${java.version}</source>
  39.  
    <target>${java.version}</target>
  40.  
    </configuration>
  41.  
    </plugin>
  42.  
     
  43.  
    <plugin>
  44.  
    <groupId>org.apache.maven.plugins</groupId>
  45.  
    <artifactId>maven-shade-plugin</artifactId>
  46.  
    <executions>
  47.  
    <execution>
  48.  
    <phase>package</phase>
  49.  
    <goals>
  50.  
    <goal>shade</goal>
  51.  
    </goals>
  52.  
    <configuration>
  53.  
    <transformers>
  54.  
    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
  55.  
    <mainClass>com.yws.echo_socket.ChangeDB</mainClass>
  56.  
    </transformer>
  57.  
    </transformers>
  58.  
    </configuration>
  59.  
    </execution>
  60.  
    </executions>
  61.  
    </plugin>
  62.  
    </plugins>
  63.  
    </build>
  64.  
    </project>
  65.  

node.js – 如何使用MongoLab在Heroku上设置MongoDB数据库?

node.js – 如何使用MongoLab在Heroku上设置MongoDB数据库?

我正在使用Express.js和MongoLab,我在生产中跟踪了 Heroku setup to get MongoDB working,在我的app.js中抛出了这段代码.

//Mongo on Heroku Setup
var mongo = require('mongodb');

var mongoUri = process.env.MONGOLAB_URI || 
  process.env.MONGOHQ_URL || 
  'mongodb://localhost/mydb'; 

mongo.Db.connect(mongoUri,function (err,db) {
  db.collection('mydocs',function(er,collection) {
    collection.insert({'mykey': 'myvalue'},{safe: true},rs) {
    });
  });
});

我的电子邮件表单(也在app.js中)有以下路由和字段:

//Routes

app.get('/',function(req,res) {
    res.render('index',{
        title: 'DumbyApp'
    });
});

//save new email
app.post('/',res){
    emailProvider.save({
        address: req.param('address')
    },function( error,docs) {
        res.redirect('/')
    });
});

这将在索引页面上呈现新表单,并允许我将其保存在本地但不在生产中,因为我不知道如何设置我的电子邮件集合.任何人都可以带我走过这个吗?使用MongoDB和Node.js的全新,所以可以使用一些帮助.

编辑:

在MongoLab数据库界面中,我创建了一个名为emails的集合.这是正确的行动方案吗?

编辑2:

这里是在app.js中定义EmailProvider以及文件本身.

app.js

var express = require('express'),routes = require('./routes'),user = require('./routes/user'),http = require('http'),path = require('path'),EmailProvider = require('./emailprovider').EmailProvider;

var emailProvider= new EmailProvider('localhost',27017);

emailprovider.js

var Db = require('mongodb').Db;
var Connection = require('mongodb').Connection;
var Server = require('mongodb').Server;
var BSON = require('mongodb').BSON;
var ObjectID = require('mongodb').ObjectID;

EmailProvider = function(host,port) {
  this.db= new Db('localdb',new Server(host,port,{safe: false},{auto_reconnect: true},{}));
  this.db.open(function(){});
};


EmailProvider.prototype.getCollection= function(callback) {
  this.db.collection('emails',function(error,email_collection) {
    if( error ) callback(error);
    else callback(null,email_collection);
  });
};

//save new email
EmailProvider.prototype.save = function(emails,callback) {
    this.getCollection(function(error,email_collection) {
      if( error ) callback(error)
      else {
        if( typeof(emails.address)=="undefined")
          emails = [emails];

        for( var i =0;i< emails.address;i++ ) {
          email = emails[i];
          email.created_at = new Date();
        }

        email_collection.insert(emails,function() {
          callback(null,emails);
        });
      }
    });
};

exports.EmailProvider = EmailProvider;

解决方法

虽然第一个代码框中的连接代码似乎是正确的,但emailProvider对象未使用它.相反,在app.js中,EmailProvider连接到localhost:27017,数据库名称在emailprovider.js中硬编码为“localdb”.

您要做的是使用EmailProvider中MONGOLAB_URI环境变量中提供的连接信息,该信息已包含主机,端口和数据库名称.

有很多方法可以做到这一点,但一种方法是将连接代码从第一个代码框移动到EmailProvider构造函数中,然后更改构造函数,使其占用URI而不是主机和端口.这样,您可以将MONGOLAB_URI变量传递给app.js中的构造函数.

node.js – 如何使用mongoose动态连接多个mongodb数据库?

node.js – 如何使用mongoose动态连接多个mongodb数据库?

在我的项目中有许多数据库,一个是masterDb,另一个是基于masterDb的数据库连接.例如,在验证页面中,用户可以输入“公司ID”,可以使用masterDb检查此“公司ID”,如果存在id,则返回特定公司的数据库名称.使用数据库名称我想连接到特定的公司数据库.

现在我可以成功登录并获得数据库名称.使用此db名称(req.headers [‘x-key-db’])我可以连接到特定数据库.但在这里我将数据库连接代码放在每个api调用中.有没有其他方法可以创建一次并在每个api调用中动态使用它.

app.get('/api/student-limited/:_pageNumber/:_pageSize',function(req,res) {
		
	var db = mongoose.createConnection();
	db.open('mongodb://localhost:27017/'+req.headers['x-key-db']);
	var ClassSection = db.model('ClassSections',SectionSchema);
	var Student = db.model('Students',StudentSchema);
	
	var _pageNumber = parseInt(req.params._pageNumber),_pageSize = parseInt(req.params._pageSize);
	Student.find({},function (err,_docs) {
		if(_docs){
			Student.find({},null,{sort: { Name: 1} }).skip(_pageNumber > 0 ? ((_pageNumber-1)*_pageSize) : 0).limit(_pageSize).populate('_idClass').exec(function (err,docs) {
			if(err)
				res.json(err);
			else
				res.json({ "TotalCount" : _docs.length,"_Array" : docs});
		     });
	    }
	});
});

解决方法

您可以创建如下所示的模块,该模块将检查您所需的数据库的数据库连接是否已存在.如果是,它将返回连接对象,否则它将创建一个并返回它.

var mongoose = require('mongoose');

//Object holding all your connection strings
var connections = {};

exports.getDatabaseConnection = function(dbname) {

    if(connections[dbname]) {
        //database connection already exist. Return connection object
        return connections[dbname];
    } else {
        connections[dbname] = mongoose.createConnection('mongodb://localhost:27017/' + dbname);
        return connections[dbname];
    }       
}

假设您将上面的文件命名为data.js.您只需要在包含API代码的文件中要求使用此模块.您的API代码将更改为:

app.get('/api/student-limited/:_pageNumber/:_pageSize',res) {
    //Call getDatabaseConnection function we created
    var db = data.getDatabaseConnection(req.headers['x-key-db']);
    var ClassSection = db.model('ClassSections',SectionSchema);
    var Student = db.model('Students',StudentSchema);

    var _pageNumber = parseInt(req.params._pageNumber),_pageSize = parseInt(req.params._pageSize);
    Student.find({},_docs) {
        if(_docs){
            Student.find({},docs) {
            if(err)
                res.json(err);
            else
                res.json({ "TotalCount" : _docs.length,"_Array" : docs});
             });
        }
    });
});

node.js – 如何使用NodeJS以超级用户身份连接到另一个MongoDB数据库?

node.js – 如何使用NodeJS以超级用户身份连接到另一个MongoDB数据库?

this problem的解决方案工作正常:

而不是做:

$mongo my_db_name -u superuser -p 1234

我做

$mongo admin -u superuser -p 1234 # connecting as super user to admin db
> use anotherDb

在壳中.

哪个是NodeJS的解决方案?

我试图连接到mongodb://超级用户:1234 @ localhost:27017 / my_db_name但我收到此错误:

{ [MongoError: auth fails] name: 'MongoError',code: 18,ok: 0,errmsg: 'auth fails' }

我的代码是:

var Db = require('mongodb').Db,MongoClient = require('mongodb').MongoClient;

MongoClient.connect("mongodb://superuser:1234@localhost:27017/my_db_name",function(err,db) {
       if (err) { return console.log(err); }
       console.log("Successfully connected.");
    }
);

请注意,超级用户是无所不能的用户,可以在任何数据库中写入和读取权限.

如果我做MongoClient.connect(“mongodb://超级用户:1234 @ localhost:27017 / admin(用admin取代my_db_name),它连接成功.为什么?

如何使用超级用户和密码(1234)连接到my_db_name?

解决方法

解决方案是使用从Nodejs端执行的shell脚本:

mongo <<EOF
use admin
db.auth("superuser","1234");
use another_db
db.addUser({
   user: "test",pwd: "12345",roles: ["userAdmin"]
});
exit
EOF

然后我可以使用以下连接字符串:“mongodb:// test:12345 @ localhost:27017 / my_db_name”.

这个解决方案有效,但我仍然在寻找Mongo原生解决方案.

关于如何使用Node.js建立与MongoDB数据库的SSH隧道连接nodejs链接mongodb的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于java jdbc使用SSH隧道连接mysql数据库demo、node.js – 如何使用MongoLab在Heroku上设置MongoDB数据库?、node.js – 如何使用mongoose动态连接多个mongodb数据库?、node.js – 如何使用NodeJS以超级用户身份连接到另一个MongoDB数据库?的相关信息,请在本站寻找。

本文标签: