You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:43:01