我正在尝试通过 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 和其他地方解决了相关问题,但没有获得任何帮助。有什么提示吗?谢谢大家
一如既往(谢谢SO),发布问题后,解决方案就出现了。
使用选项
/EnableMongoDbEndpoint=3.6
或 /EnableMongoDbEndpoint=4.0
运行模拟器可以解决该问题。虚拟应用程序连接成功并打开数据库。
命令行参数参考位于此处。
对我来说,使用 127.0.0.1:8081 而不是 localhost:8081 后它起作用了。 可以在这里找到讨论 - https://github.com/actions/runner-images/issues/7039#issuecomment-1705467309