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");
});
});
正如您在上面的代码中看到的,我们首先创建一个数据库连接,然后再做其他事情。这有一些优点:
- 如果您的凭据无效,则您的应用程序无法从外部访问,因为 http 服务器未启动
- 所有请求都只有一个连接
- 数据库查询可能会更快,因为您不必先等待建立数据库连接
注意:上面的代码在这里是“内联编码”的,没有经过测试。
但我认为它说明了我的声明背后的概念。
我在谷歌上搜索了很多,但仍然没有解决我的问题的明确方法。 连接到 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");
});
});
正如您在上面的代码中看到的,我们首先创建一个数据库连接,然后再做其他事情。这有一些优点:
- 如果您的凭据无效,则您的应用程序无法从外部访问,因为 http 服务器未启动
- 所有请求都只有一个连接
- 数据库查询可能会更快,因为您不必先等待建立数据库连接
注意:上面的代码在这里是“内联编码”的,没有经过测试。 但我认为它说明了我的声明背后的概念。