繁体   English   中英

通过 Mongoose (nodejs) 从远程服务器连接到 MongoDB

[英]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 从我的笔记本电脑建立到服务器的连接。

你能帮我找出我的配置有什么问题吗? 或者帮我解释错误信息

这是有效的:

  1. [终端] - ssh进入框并使用mongo shell
  2. [节点] - 使用tunnel-ssh我可以建立到远程服务器的连接
  3. [node] - 使用 npm mongodb包我可以创建到数据库的连接

但是,我无法使用tunnel-sshmongoose建立连接。 这是我正在尝试的代码:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM