使用MongoDB客户端字段级加密遇连接错误:ECONNREFUSED 127.0.0.1:27020
解决MongoDB客户端字段级加密的ECONNREFUSED 127.0.0.1:27020错误
错误原因
这个报错是因为MongoDB客户端字段级加密依赖的mongocryptd辅助进程未运行,或者驱动无法连接到该进程。mongocryptd默认监听27020端口,负责处理加密相关的逻辑运算。
解决方案
1. 确保mongocryptd进程正常运行
- 先确认MongoDB安装目录下存在
mongocryptd可执行文件(通常和mongod在同一目录) - 手动启动进程:
启动后可保持终端窗口打开,或添加mongocryptd --port 27020 --bind_ip 127.0.0.1--fork参数让其后台运行(需提前配置日志文件路径)。
2. 修复代码中的关键问题
你的代码存在两处会引发异常的问题:
createDataKey的then回调未返回生成的dataKeyId,导致后续schemaMap中的keyId为undefined- 加密客户端配置未开启自动启动
mongocryptd的选项,驱动无法自动拉起该进程
修正后的代码示例:
// 修正createDataKey的处理逻辑,确保获取到有效的dataKeyId const dataKeyId = await clientEncryption.createDataKey("local"); console.log("Encryption key generated"); const schemaMap = { [`${dbName}.${collName}`]: { properties: { sensitiveField: { encrypt: { keyId: [dataKeyId], bsonType: "string", algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", }, }, }, }, }; const encryptedClient = new MongoClient(URL, { useUnifiedTopology: true, autoEncryption: { keyVaultNamespace, kmsProviders, schemaMap, // 添加extraOptions配置,让驱动自动启动mongocryptd extraOptions: { mongocryptdURI: "mongodb://127.0.0.1:27020", mongocryptdSpawnPath: "/path/to/your/mongocryptd", // 替换为实际路径,比如MongoDB安装目录下的mongocryptd mongocryptdSpawnArgs: [], }, }, }); // 后续逻辑保持不变 try { await encryptedClient.connect(); const db = encryptedClient.db(dbName); const collection = db.collection(collName); const doc = { medicalRecords: "my-sensitive-data", sensitiveField: "hsbdb-jd256b", bloodType: "O+", insurance: "hgvdw35w6-7643", }; const result = await collection.insertOne(doc); if (result) console.log("data entered successfully"); } catch (error) { console.log("Error:", error); }
3. 配置验证
- 确认
mongocryptdSpawnPath路径正确:Windows系统通常为C:\Program Files\MongoDB\Server\{版本号}\bin\mongocryptd.exe,Linux/macOS系统通常为/usr/local/bin/mongocryptd - 若已手动启动
mongocryptd,可省略mongocryptdSpawnPath配置,驱动会直接连接到27020端口
内容的提问来源于stack exchange,提问作者Brijesh lakhani
相关产品推荐
相关产品推荐

