Node.js MongoDB客户端连接时出现ENOTFOUND错误,主机名被异常解析为'tor!'
Node.js MongoDB客户端连接时出现ENOTFOUND错误,主机名被异常解析为'tor!'
看起来你遇到的问题根源很明确——连接字符串里的密码包含特殊字符但没做URL编码,导致MongoDB客户端把密码里的@当成了用户名/密码段和主机地址段的分隔符,错误地把密码中@后面的部分(也就是tor!)当成了要连接的主机名,自然就会出现getaddrinfo ENOTFOUND tor!的错误。
问题分析
你的连接URI是这样的:
const uri = "mongodb://MyUserName:P@$$W0RD!@192.168.1.10:27017/?retryWrites=true&w=majority";
密码里的第一个@会被客户端误判为用户名密码的结束标记,所以它会把P当作密码,把$$W0RD!(或者你实际密码里的tor!部分)当成主机名,完全忽略了后面的192.168.1.10。而Python脚本和MongoDB Compass能正常工作,是因为它们的客户端在处理连接字符串时,会自动处理密码中的特殊字符,或者内部做了URL编码。
两种解决方案
方案1:手动对密码中的特殊字符进行URL编码
URI中需要编码的常见特殊字符对应关系:
@→%40$→%24!→%21
把你的密码P@$$W0RD!编码后变成P%40%24%24W0RD%21,修改后的URI如下:
const uri = "mongodb://MyUserName:P%40%24%24W0RD%21@192.168.1.10:27017/?retryWrites=true&w=majority";
方案2:通过options参数传递用户名和密码(更推荐)
这种方式不需要对密码做任何编码,直接在MongoClient的配置选项里单独指定认证信息,更清晰也不容易出错:
const {MongoClient} = require('mongodb'); async function main(){ // 只保留地址和参数部分 const uri = "mongodb://192.168.1.10:27017/?retryWrites=true&w=majority"; // 通过auth选项传递用户名密码 const client = new MongoClient(uri, { auth: { username: "MyUserName", password: "P@$$W0RD!" } }); try { await client.connect(); await listDatabases(client); } catch (e) { console.error(e); } finally { await client.close(); } } async function listDatabases(client){ databasesList = await client.db().admin().listDatabases(); console.log("Databases:"); databasesList.databases.forEach(db => console.log(` - ${db.name}`)); }; main().catch(console.error);
选其中一种方案修改后,应该就能正常连接到你的MongoDB数据库了。
备注:内容来源于stack exchange,提问作者tyleax
相关产品推荐
相关产品推荐

