连接到AWS DocumentDB时发生连接错误

时间:2019-01-28 07:57:20

标签: node.js mongodb amazon-web-services

从node.js连接到AWS DocumentDB时遇到以下错误

  

连接错误:{[[MongoNetworkError:连接1至   docdb-2019-01-28-06-57-37.cluster-cqy6h2ypc0dj.us-east-1.docdb.amazonaws.com:27017   超时]名称:“ MongoNetworkError”,错误标签:[   'TransientTransactionError']}

这是我的节点js文件

app.js

var mongoose = require('mongoose');
mongoose.connect('mongodb://abhishek:abhishek@docdb-2019-01-28-06-57-37.cluster-cqy6h2ypc0dj.us-east-1.docdb.amazonaws.com:27017/?ssl_ca_certs=rds-combined-ca-bundle.pem&replicaSet=rs0', {
    useNewUrlParser: true
});
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
    console.log("connected...");
});

2 个答案:

答案 0 :(得分:6)

默认情况下,aws documentdb设计为仅从同一VPC连接。 因此,要从同一vpc中的ec2连接nodejs应用程序。您需要拥有pem文件,因为默认情况下在创建数据库实例时启用了SSL。

步骤1:wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem在所需目录中

第2步:使用指向pem文件的选项更改猫鼬连接

mongoose.connect(database.url, { useNewUrlParser: true, ssl: true, sslValidate: false, sslCA: fs.readFileSync('./rds-combined-ca-bundle.pem')}) .then(() => console.log('Connection to DB successful')) .catch((err) => console.error(err,'Error'));

这里使用猫鼬5.4.0

要从VPC外部进行连接,请尝试遵循来自AWS的以下文档: https://docs.aws.amazon.com/documentdb/latest/developerguide/connect-from-outside-a-vpc.html

我个人只是尝试通过VPC进行连接,并且工作正常。

更新=====:>

要通过VPC外部的Robo 3T连接,请点击链接- AWS DocumentDB with Robo 3T (Robomongo)

答案 1 :(得分:0)

以下帮助程序运行一个函数,如果遇到“ TransientTransactionError”,则重试该函数:

对于使用mongoDB ##的node.js

有关更多信息,请访问:https://docs.mongodb.com/manual/core/transactions/#retry-transaction

async function runTransactionWithRetry(txnFunc, client, session) {
  try {
    await txnFunc(client, session);
  } catch (error) {
    console.log('Transaction aborted. Caught exception during transaction.');

    // If transient error, retry the whole transaction
    if (error.errorLabels && error.errorLabels.indexOf('TransientTransactionError') >= 0) {
      console.log('TransientTransactionError, retrying transaction ...');
      await runTransactionWithRetry(txnFunc, client, session);
    } else {
      throw error;
    }
  }
}

并首先检查您的网络连接,因为这是这里的优先事项。网络错误基本上表示“我在那里找不到任何东西”。通常是因为它无法从您尝试到达的地方到达。
并确保您的数据库连接已打开。