通过 Mongoose (nodejs) 从远程服务器连接到 MongoDB
Connecting to MongoDB from remote server via Mongoose (nodejs)
我在 Digital Ocean 中有一个 droplet,它是 运行 MongoDB (4.0.3) 和 Ubuntu (18.04)。我用他们的一键编队创建了这个。我按照数字海洋教程进行了 secure mongodb and to configure remote access。如果我 ssh 进入盒子并使用 mongo shell,一切都会很好。但是,我无法通过 nodejs/mongoose.
从笔记本电脑建立与服务器的连接
你能帮我找出我的配置有什么问题吗?或者帮我解释错误信息
这是有效的:
- [terminal] -
ssh
进入框并使用 mongo
shell
- [node] - 使用
tunnel-ssh
我可以建立到远程服务器的连接
- [node] - 使用 npm
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 添加到管理数据库
我仍然不确定隧道为什么不起作用,我本以为它还能起作用?
我在 Digital Ocean 中有一个 droplet,它是 运行 MongoDB (4.0.3) 和 Ubuntu (18.04)。我用他们的一键编队创建了这个。我按照数字海洋教程进行了 secure mongodb and to configure remote access。如果我 ssh 进入盒子并使用 mongo shell,一切都会很好。但是,我无法通过 nodejs/mongoose.
从笔记本电脑建立与服务器的连接你能帮我找出我的配置有什么问题吗?或者帮我解释错误信息
这是有效的:
- [terminal] -
ssh
进入框并使用mongo
shell - [node] - 使用
tunnel-ssh
我可以建立到远程服务器的连接 - [node] - 使用 npm
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 教程
我仍然不确定隧道为什么不起作用,我本以为它还能起作用?