2016-12-01 256 views
2

我有兩個Mongo數據庫。一個是我的開發環境,一個生產這裏從我Robomongo安裝看出:Node.js使用Mongoose到MongoDB的SSH隧道

Two Mongo DBs

生產DB是SSH隧道到我的數字海洋虛擬服務器在這裏看到(細節有了明顯改變)。連接時,此設置工作正常/從我製作的網站:

SSH Tunnel Settings

我現在的工作在不同的/相關的項目,需要我本地機器連接到我的生產 DB,所以我認爲我需要使用類似tunnel-ssh的東西來完成它。我以this answer爲例,但是我要麼Error: (SSH) Channel open failure: open failed要麼連接到我的Dev數據庫(當我使用27017作爲我的dstHost/dstPort/localPort時)。我必須考慮這個錯誤,否則我對我的配置感到啞巴。無可否認,我是一個完全的Mongo/Mongoose新手,所以兩者同樣可行。有什麼建議?

var fs = require("fs"); 
var mongoose = require('mongoose'); 
var tunnel = require('tunnel-ssh'); 

//===== db connection ===== 

var config = { 
    username:'my.username', 
    host:'my.ip.address', 
    agent : process.env.SSH_AUTH_SOCK, 
    privateKey:require('fs').readFileSync('/Users/myusername/.ssh/id_rsa'), 
    port:22, 
    dstHost:'mongodb://localhost:27000/mydbname', 
    dstPort:27000, 
    localHost:'127.0.0.1', 
    password:'mypassword', 
    localPort: 27000 
}; 

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

    var db = mongoose.connection; 
    db.on('error', console.error.bind(console, 'DB connection error:')); 
    db.once('open', function() { 
     // we're connected! 
     console.log("DB connection successful"); 
     // console.log(server); 
    }); 
}); 

在此先感謝!

回答

2

dstHost需要是主機名/ IP,而不是MongoDB連接字符串。在這種情況下,您可以在此特定情況下實際省略dstHostlocalHostlocalPort,因爲它們已默認爲您提供的值。

+0

好吧,至少進展。評論這三個,現在我得到'錯誤:(SSH)頻道開放失敗:連接被拒絕。對你來說意味着什麼?關我進入Google機器... – jeremytripp

+1

您沒有使用與您在屏幕截圖中顯示的端口相同的端口。因此請嘗試相應地改變它以匹配。您還需要更改連接字符串中的端口。 – mscdex

+0

這是票。在今天上午閱讀你的評論之後5秒內痛苦地顯而易見並得到修復。非常感謝! – jeremytripp

3

未來參考的最終工作配置。感謝mscdex - 我只需提供正確的 dstPort並將其包含在我的Mongo URI字符串(27017)中。很簡單。希望這可以幫助。

var config = { 
    username:'myusername', 
    host:'my.ip.address', 
    agent : process.env.SSH_AUTH_SOCK, 
    privateKey:require('fs').readFileSync('/Users/myusername/.ssh/id_rsa'), 
    port:22, 
    dstPort:27017, 
    password:'mypassword' 
}; 

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

    var db = mongoose.connection; 
    db.on('error', console.error.bind(console, 'DB connection error:')); 
    db.once('open', function() { 
     // we're connected! 
     console.log("DB connection successful"); 
    }); 
}); 
+0

嗨我已經嘗試過您的解決方案,它非常有幫助,但我不得不添加密碼才能使其正常工作。非常感謝你 :) – Yoga