无法使用 Node.js MongoDB 驱动程序连接到 Cosmos DB 模拟器

问题描述 投票:0回答:2

我正在尝试通过 MongoDB 驱动程序将虚拟 Node.js 应用程序连接到本地 Cosmos DB 模拟器实例。虚拟应用程序尝试连接,如果成功则尝试打开数据库。过去我能够在更复杂的应用程序中使用相同的设置进行连接,但现在无法连接,因此我创建了新的虚拟应用程序,该应用程序也无法连接。

我用

"C:\Program Files\Azure Cosmos DB Emulator\Microsoft.Azure.Cosmos.Emulator.exe" /EnableMongoDbEndpoint
运行模拟器。模拟器管理面板显示在 https://localhost:8081/_explorer/index.html。 Studio 3T for MongoDB 成功连接到 localhost@localhost:10255。

我按照说明导出模拟器证书,将其复制到项目根目录并使用

const certFilePath = path.resolve(__dirname, '../', 'documentdbemulatorcert.cer');
在代码中获取其路径。

我尝试使用 Mongo 连接字符串(从管理面板复制)连接两者:

const connectOptions = {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  ssl: true,
  sslValidate: true,
  sslCA: certFilePath,
};
const client = new MongoClient(MONGODB_CONNECTION_STRING, connectOptions);

以及 Mongo URI、用户名和未编码的密码(再次从管理面板复制):

const connectOptions = {
  auth: {
    username: MONGODB_AUTH_USERNAME,
    password: MONGODB_AUTH_PASSWORD_NOT_ENCODED,
  },
  useNewUrlParser: true,
  useUnifiedTopology: true,
  ssl: true,
  sslValidate: true,
  sslCA: certFilePath,
};
const client = new MongoClient(MONGODB_URI, connectOptions);

无论如何,尝试与此联系:

try {
  await client.connect();
  console.log('Connection to server successful');
} catch (error) {
  console.error('Connection to server failed:', error);
}

因以下错误而失败:

Connection to server failed: MongoServerSelectionError: connect ECONNREFUSED ::1:10255
    at Timeout._onTimeout (...my-project-root...\node_modules\mongodb\lib\sdam\topology.js:292:38)
    at listOnTimeout (node:internal/timers:564:17)
    at process.processTimers (node:internal/timers:507:7) {
  reason: TopologyDescription {
    type: 'Unknown',
    servers: Map(1) { 'localhost:10255' => [ServerDescription] },
    stale: false,
    compatible: true,
    heartbeatFrequencyMS: 10000,
    localThresholdMS: 15,
    setName: null,
    maxElectionId: null,
    maxSetVersion: null,
    commonWireVersion: 0,
    logicalSessionTimeoutMinutes: null
  },
  code: undefined,
  [Symbol(errorLabels)]: Set(0) {}
}

我也尝试过排除

useNewUrlParser
useUnifiedTopology
ssl
sslValidate
sslCA
,但没有效果。我还尝试在运行应用程序之前设置
NODE_TLS_REJECT_UNAUTHORIZED=0
:有一个关于安全性较低的附加警告,但随后出现同样的错误。我也尝试过从 Studio 3T 复制连接字符串,但除了一些尾随参数之外,它们与模拟器管理面板相同,并且以同样的方式失败。

我已经下载了管理门户快速入门页面中链接的示例 Node.js 应用程序,该应用程序使用 CosmosClient。它失败并出现基本相同的错误:

已完成,但出现错误 {"message":"请求 https://localhost:8081/ 失败,原因:连接 ECONNREFUSED ::1:8081","type":"system","errno":"ECONNREFUSED","代码":"ECONNREFUSED","headers":{"x-ms-throttle-retry-count":0,"x-ms-throttle-retry-wait-time-ms":0}}

(尽管模拟器仍在使用

/EnableMongoDbEndpoint
选项运行)

一些上下文信息:Windows 11 x64、节点 19.1.0、mongodb 4.12.1、Cosmos 模拟器 2.14.9.0。

我已经在 SO 和其他地方解决了相关问题,但没有获得任何帮助。有什么提示吗?谢谢大家

node.js mongodb azure-cosmosdb azure-cosmosdb-emulator
2个回答
1
投票

一如既往(谢谢SO),发布问题后,解决方案就出现了。

使用选项

/EnableMongoDbEndpoint=3.6
/EnableMongoDbEndpoint=4.0
运行模拟器可以解决该问题。虚拟应用程序连接成功并打开数据库。

命令行参数参考位于此处


0
投票

对我来说,使用 127.0.0.1:8081 而不是 localhost:8081 后它起作用了。 可以在这里找到讨论 - https://github.com/actions/runner-images/issues/7039#issuecomment-1705467309

© www.soinside.com 2019 - 2024. All rights reserved.