无法使用 Node.js 驱动程序本地连接到 MongoDB 6.0 服务器

Can't connect to MongoDB 6.0 Server locally using Node.js driver

提问人:Sushant 提问时间:11/29/2022 最后编辑:raySushant 更新时间:11/22/2023 访问量:2726

问:

我刚刚开始学习MongoDB,我正在尝试通过MongoDB Server 6.0(不使用MongooseAtlas)在本地托管我的Node.js应用程序。

我复制了MongoDB文档中给出的异步JavaScript代码。我确保在执行以下代码之前运行mongod

MongoDB 服务器已启动MongoDB server started

const { MongoClient } = require("mongodb");

// Connection URI
const uri =
  "**mongodb://localhost:27017**";

// Create a new MongoClient
const client = new MongoClient(uri);

async function run() {
  try {
    // Connect the client to the server (optional starting in v4.7)
    await client.connect();

    // Establish and verify connection
    await client.db("admin").command({ ping: 1 });
    console.log("Connected successfully to server");
  } finally {
    // Ensures that the client will close when you finish/error
    await client.close();
  }
}
run().catch(console.dir);

它抛出了一个错误:

Image of the error it's throwing

node.js mongodb 异步等待本地 主机 mongodb-nodejs-driver

评论

1赞 rickhg12hs 11/29/2022
如果你使用会怎样?const uri = "mongodb://127.0.0.1:27017";
1赞 rootExplorr 11/29/2022
你是从窗户运行的吗?您可以从 Windows 的服务启动 mongob 然后重试吗
1赞 Sushant 11/29/2022
成功了!我都做了。首先,从服务中重新启动mongodb,将localhost更改为127.0.0.1,连接成功。非常感谢!
2赞 Wernfried Domscheit 12/21/2022
请不要粘贴屏幕截图,请使用格式化文本。查看 meta.stackoverflow.com/q/285551

答:

13赞 Wernfried Domscheit 11/29/2022 #1

问题是,别名解析为 IPv6 地址而不是localhost::1127.0.0.1

但是,net.ipv6 默认为 .false

最好的选择是使用此配置启动MongoDB:

net:
  ipv6: true
  bindIpAll: true

net:
  ipv6: true
  bindIp: localhost

然后所有变体都将起作用:

C:\>mongosh "mongodb://localhost:27017" --quiet --eval "db.getMongo()"
mongodb://localhost:27017/?directConnection=true&appName=mongosh+1.6.0

C:\>mongosh "mongodb://127.0.0.1:27017" --quiet --eval "db.getMongo()"
mongodb://127.0.0.1:27017/?directConnection=true&appName=mongosh+1.6.0

C:\>mongosh "mongodb://[::1]:27017" --quiet --eval "db.getMongo()"
mongodb://[::1]:27017/?directConnection=true&appName=mongosh+1.6.0

C:\>mongosh "mongodb://%COMPUTERNAME%:27017" --quiet --eval "db.getMongo()"
$ mongosh "mongodb://$HOSTNAME:27017" --quiet --eval "db.getMongo()"
mongodb://******:27017/?directConnection=true&appName=mongosh+1.6.0

如果您不将 MongoDB 作为服务运行,那么它将是

mongod --bind_ip_all --ipv6 <other options>

注意,我不喜欢配置

net:
  bindIp: <ip_address>

在我看来,这只有在具有多个网络接口的计算机上才有意义。但是,由于MongoDB不支持多个接口,因此也没有多大意义。 此外,根据您的网络设置,此 IP 可能随时更改。

如果您只想允许来自本地计算机的连接,例如在维护时或用作 Web 服务的后端数据库时,请使用。如果您希望允许从远程计算机进行连接,请使用。bindIp: localhostbindIpAll: true

评论

0赞 Henk Kruger 5/11/2023
我在官方文档中找不到这个是没有意义的,但我确实在这里找到了它。在尝试了很多事情之后,你上面的“最佳选择”对我有用。
0赞 Wernfried Domscheit 5/11/2023
与其说是MongoDB的问题,不如说是操作系统的问题。
-1赞 Rahul sharma 4/20/2023 #2

你可以试试这个:

mongoose.connect("mongodb://0.0.0.0:27017").then(() => {
  console.log("database connected)).catch((err) => {
  console.log("error while connecting to database")
})

评论

2赞 Wernfried Domscheit 5/7/2023
我不认为 IP 会起作用,通常它意味着“任何 IP 地址”。除此之外,您应该始终打印正确的错误,而不是不提供任何信息的静态文本。0.0.0.0"error while connecting to database"
0赞 Liang 6/4/2023
我为我工作
0赞 Vedanta MS 9/29/2023 #3

如果您使用的是节点版本 18(Ig,它也适用于 17),请使用此选项

mongoose.connect("mongodb://127.0.0.1:27017/newdb", {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});
var db = mongoose.connection;

db.on("error", () => console.log("error connecting to database"));

db.once("open", () => console.log("Connected to database"));

评论

0赞 Wernfried Domscheit 11/15/2023
"error connecting to database"是一个相当糟糕的错误消息。最好打印真正的错误,例如 甚至更好的是完整的错误堆栈db.on("error", (err) => console.log("error connecting to database: " + err.message));
0赞 AWE FRANCIS OLAWUMI 10/16/2023 #4

问题是,localhost 别名解析为 IPv6 地址 ::1 而不是 127.0.0.1

从上面的答案。给我的总结@Wernfried Domscheit

我只是用它替换它,它起作用了。mongodb://localhost/dbNamemongodb://127.0.0.1:27017/dbName