next.js 和 mongodb 连贯?

next.js and mongodb coherence?

我在谷歌上搜索了很多,但仍然没有解决我的问题的明确方法。 连接到 MongoDB,通常您会建立一个连接,并在工作完成后关闭它。 由于 next.js(可能 node.js)是单线程的。有时会发生两个异步处理的请求,其中一个请求建立了与数据库的连接,另一个请求关闭了完全相同的连接。所以第一个请求遇到了 Topology closed 异常。我感觉 mongodb 驱动程序客户端是共享的。 有没有我没理解正确的地方?

try {
        await client.connect()
        const database = client.db("test")
        const collection = database.collection("test")
        const newDataset = await collection.insertOne({})
        return newDataset.insertedId.toString()
    } finally {
        await client.close();
    }

如评论所述,我在 Whosebug 上看到了很多示例和问题,其中在每个收到的请求(下面的示例)中都建立了数据库连接。这没有任何好处,而且是“坏的”,因为它只需要时间而且没有意义。例如:

app.get("/", (req, res) => {
  MongoClient.connect("...", (err, client) => {
     // do what ever you want here
     client.close();
  });
});

如果您的应用程序需要数据库连接,请在“启动阶段”建立连接并保持连接打开。没有理由为每个请求打开和关闭数据库连接。


const mongodb = require("monogdb");
const express = require("express");
const app = express();

// some custom init stuff
// e.g. require your route handler etc.

mongodb.MongoClient("...", (err, client) => {

  // do what ever you want with the db connection now
  // e.g. monkey patch it, so you can use it in other files
  // (There are better ways to handle that)
  mongodb.client = client;

  // or the better way
  // pass it as function parameter
  require("./routes")(app, client);
  
  app.listen(8080, () => {
     console.log("http server listening");
  });

});

正如您在上面的代码中看到的,我们首先创建一个数据库连接,然后再做其他事情。这有一些优点:

  1. 如果您的凭据无效,则您的应用程序无法从外部访问,因为 http 服务器未启动
  2. 所有请求都只有一个连接
  3. 数据库查询可能会更快,因为您不必先等待建立数据库连接

注意:上面的代码在这里是“内联编码”的,没有经过测试。 但我认为它说明了我的声明背后的概念。