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

Sus*_*ant 5 localhost mongodb node.js async-await mongodb-nodejs-driver

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

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

MongoDB 服务器已启动 MongoDB 服务器已启动

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);
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误:

它抛出的错误的图像

Wer*_*eit 14

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

但是,net.ipv6默认为false.

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

net:
  ipv6: true
  bindIpAll: true
Run Code Online (Sandbox Code Playgroud)

或者

net:
  ipv6: true
  bindIp: localhost
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

mongod --bind_ip_all --ipv6 <other options>
Run Code Online (Sandbox Code Playgroud)

注意,我不喜欢配置

net:
  bindIp: <ip_address>
Run Code Online (Sandbox Code Playgroud)

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

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