这篇文章主要围绕如何使用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)
- java jdbc使用SSH隧道连接mysql数据库demo
- node.js – 如何使用MongoLab在Heroku上设置MongoDB数据库?
- node.js – 如何使用mongoose动态连接多个mongodb数据库?
- node.js – 如何使用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
-
package com.yws.echo_socket;
-
-
-
import com.jcraft.jsch.JSch;
-
import com.jcraft.jsch.Session;
-
-
import java.sql.*;
-
-
//http://my.oschina.net/Thinkeryjgfn/blog/177283
-
//http://www.cnblogs.com/I-will-be-different/p/3925351.html?utm_source=tuicool&utm_medium=referral
-
//java jdbc使用SSH隧道连接mysql数据库demo
-
public class ChangeDB {
-
-
-
-
public static void go() {
-
try {
-
JSch jsch = new JSch();
-
Session session = jsch.getSession( "yunshouhu", "192.168.0.102", 22);
-
session.setPassword( "xxxx");
-
session.setConfig( "StrictHostKeyChecking", "no");
-
session.connect();
-
System.out.println(session.getServerVersion()); //这里打印SSH服务器版本信息
-
-
//ssh -L 192.168.0.102:5555:192.168.0.101:3306 yunshouhu@192.168.0.102 正向代理
-
int assinged_port = session.setPortForwardingL("192.168.0.101",5555, "192.168.0.101", 3306);//端口映射 转发
-
-
System.out.println( "localhost:" + assinged_port);
-
-
//ssh -R 192.168.0.102:5555:192.168.0.101:3306 yunshouhu@192.168.0.102
-
//session.setPortForwardingR("192.168.0.102",5555, "192.168.0.101", 3306);
-
// System.out.println("localhost: -> ");
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
-
-
-
-
public static void main(String[] args) {
-
-
-
try {
-
//1、加载驱动
-
Class.forName( "com.mysql.jdbc.Driver");
-
} catch (ClassNotFoundException e) {
-
e.printStackTrace();
-
}
-
//2、创建连接
-
Connection conn = null;
-
Connection conn2 = null;
-
try {
-
-
conn2 = DriverManager.getConnection( "jdbc:mysql://localhost:3306/mysql", "hadoop", "xxxx");
-
getData(conn2);
-
} catch (SQLException e) {
-
System.out.println( "未连接上数据库");
-
e.printStackTrace();
-
}
-
-
try{
-
System.out.println( "=============");
-
go();
-
conn = DriverManager.getConnection( "jdbc:mysql://192.168.0.101:5555/mysql", "hadoop", "xxx");
-
getData(conn);
-
-
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
-
-
-
}
-
-
private static void getData(Connection conn) throws SQLException {
-
-
// 获取所有表名
-
Statement statement = conn.createStatement();
-
ResultSet resultSet = statement
-
.executeQuery( "select * from help_keyword");
-
// 获取列名
-
ResultSetMetaData metaData = resultSet.getMetaData();
-
for (int i = 0; i < metaData.getColumnCount(); i++) {
-
// resultSet数据下标从1开始
-
String columnName = metaData.getColumnName(i + 1);
-
int type = metaData.getColumnType(i + 1);
-
if (Types.INTEGER == type) {
-
// int
-
} else if (Types.VARCHAR == type) {
-
// String
-
}
-
System.out.print(columnName + "\t");
-
}
-
System.out.println();
-
// 获取数据
-
while (resultSet.next()) {
-
for (int i = 0; i < metaData.getColumnCount(); i++) {
-
// resultSet数据下标从1开始
-
System.out.print(resultSet.getString(i + 1) + "\t");
-
}
-
System.out.println();
-
-
}
-
statement.close();
-
conn.close();
-
}
-
-
}
-
<?xml version="1.0" encoding="UTF-8"?>
-
<project xmlns="http://maven.apache.org/POM/4.0.0"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
<parent>
-
<artifactId>grpc-demo</artifactId>
-
<groupId>org.jiepu</groupId>
-
<version>1.0</version>
-
</parent>
-
<modelVersion>4.0.0</modelVersion>
-
-
<artifactId>echo_socket</artifactId>
-
-
<properties>
-
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-
<java.version>1.6</java.version>
-
</properties>
-
-
<dependencies>
-
-
<dependency>
-
<groupId>com.jcraft</groupId>
-
<artifactId>jsch</artifactId>
-
<version>0.1.53</version>
-
</dependency>
-
<dependency>
-
<groupId>mysql</groupId>
-
<artifactId>mysql-connector-java</artifactId>
-
<version>5.1.36</version>
-
</dependency>
-
</dependencies>
-
<build>
-
<plugins>
-
<plugin>
-
<groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-compiler-plugin</artifactId>
-
<configuration>
-
<source>${java.version}</source>
-
<target>${java.version}</target>
-
</configuration>
-
</plugin>
-
-
<plugin>
-
<groupId>org.apache.maven.plugins</groupId>
-
<artifactId>maven-shade-plugin</artifactId>
-
<executions>
-
<execution>
-
<phase>package</phase>
-
<goals>
-
<goal>shade</goal>
-
</goals>
-
<configuration>
-
<transformers>
-
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-
<mainClass>com.yws.echo_socket.ChangeDB</mainClass>
-
</transformer>
-
</transformers>
-
</configuration>
-
</execution>
-
</executions>
-
</plugin>
-
</plugins>
-
</build>
-
</project>
-
node.js – 如何使用MongoLab在Heroku上设置MongoDB数据库?
//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中MONGOLAB_URI环境变量中提供的连接信息,该信息已包含主机,端口和数据库名称.
有很多方法可以做到这一点,但一种方法是将连接代码从第一个代码框移动到EmailProvider构造函数中,然后更改构造函数,使其占用URI而不是主机和端口.这样,您可以将MONGOLAB_URI变量传递给app.js中的构造函数.
node.js – 如何使用mongoose动态连接多个mongodb数据库?
现在我可以成功登录并获得数据库名称.使用此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数据库?
而不是做:
$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?
解决方法
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数据库?的相关信息,请在本站寻找。
本文标签: