[英]Connecting to MongoDB from remote server via Mongoose (nodejs)
我在運行 MongoDB (4.0.3) 和 Ubuntu (18.04) 的 Digital Ocean 中有一個 Droplet。 我用他們的一鍵編隊創建了這個。 我按照數字海洋教程來保護 mongodb並配置遠程訪問。 如果我 ssh 進入盒子並使用 mongo shell,一切都會很好。 但是,我無法通過 nodejs/mongoose 從我的筆記本電腦建立到服務器的連接。
你能幫我找出我的配置有什么問題嗎? 或者幫我解釋錯誤信息
這是有效的:
ssh
進入框並使用mongo
shelltunnel-ssh
我可以建立到遠程服務器的連接mongodb
包我可以創建到數據庫的連接但是,我無法使用tunnel-ssh
與mongoose
建立連接。 這是我正在嘗試的代碼:
const mongoose = require('mongoose')
const tunnel = require('tunnel-ssh');
const config = {
username: 'user',
password: 'pass',
host: 'myLaptopIp',
port: 22,
dstHost: 'severRunningMongo',
dstPort: 27017, // this was open via `sudo ufw allow from myLaptopIp to any port 27017`
localHost: '127.0.0.1',
localPort: 27017
};
tunnel(config, (error, server) => {
if (error) {
console.log('SSH connection error: ' + error);
}
const url = 'mongodb://${dbuser}:${dbpass}@127.0.0.1:27017/${dbname}';
mongoose.connect(url, { useNewUrlParser: true });
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'DB connection error:'));
db.once('open', function() {
console.log('DB connection successful');
});
});
我得到的錯誤是
Error: connect ECONNREFUSED myLaptopIp:22
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1137:16)
Emitted 'error' event on Server instance at:
at Client.emit (events.js:311:20)
at Socket.<anonymous> (/~/node_modules/ssh2/lib/client.js:294:10)
at Socket.emit (events.js:311:20)
at emitErrorNT (internal/streams/destroy.js:92:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
at processTicksAndRejections (internal/process/task_queues.js:84:21) {
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED',
syscall: 'connect',
address: 'myLaptopIp',
port: 22,
level: 'client-socket'
}
如果我將localPort
更改為2000
或者如果我更改 mongo 連接 url 以包含 mongoServerIp,我會收到錯誤消息:
MongoNetworkError: failed to connect to server [127.0.0.1:27017] on first connect [Error: connect ECONNREFUSED 127.0.0.1:27017
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1137:16) {
name: 'MongoNetworkError'
你知道當你提出一個問題,然后 1 分鍾后你會想到一些新的嘗試,而那個新的東西完全有效嗎?
我想我根本不需要使用tunnel-ssh
,因為我已經打開了服務器以允許從我的筆記本電腦進行遠程訪問。 這對我有用
const mongoose = require('mongoose')
const url = 'mongodb://{dbUser}:{dbPass}@{mongoServerIp}:27017/{dbName}?authSource=admin';
mongoose.connect(url);
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'DB connection error:'));
db.once('open', function() {
console.log('DB connection successful');
});
我確實需要將?authSource=admin
添加到 url 的末尾,否則它不起作用。 我按照 DO 教程中的建議將我的 dbuser 添加到 admin db
我仍然不確定為什么隧道不起作用,我原以為它仍然有效?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.