这与其说是一个问题,不如说是一个咨询请求。我找不到资源来检查我的方法的有效性,所以我想听听 MongoDB 专家的意见。
我在玩弄 MongoDB 并想出了这个中间件方法来将客户端传递到我的路由。我有这个 Express 中间件:
const addClientToRequest = async (req, _, next) => {
const client = new MongoClient(uri);
await client.connect();
req.client = client;
next();
};
app.use(addClientToRequest);
之后,我在路由中使用 req.client 来访问我的数据库。
app.get("/:id", async (req, res) => {
const client = req.client;
const id = req.params.id;
try {
const data = await client.db("mydb").collection("mycollection").findOne({ id });
if (data) return res.status(200).json(data);
} catch (error) {
return res
.status(500)
.json({ message: "Error fetching requested data", error });
}
return res.status(404).json({ message: "Requested data cannot be found" });
});
这种方法会有什么问题?这样用MongoDB客户端可以吗?
最佳答案
根据我的经验,我们总是定义一个单独的实用程序来在应用程序启动时加载连接池,然后重用这些连接。
在上述方法中,您似乎为发出的每个 HTTP 请求创建一个新连接,然后不终止(或)关闭连接。这对于大型应用来说可能代价高昂。
db.util.js
const { MongoClient } = require("mongodb");
const uri = `mongodb://${process.env.DB_USER}:${process.env.DB_PASSWORD}@localhost:27017/${process.env.DATABASE}?maxPoolSize=2-&w=majority`;
const client = new MongoClient(uri);
const init = async () => {
try {
await client.connect();
console.log("Connected");
} catch (error) {
console.log(error);
}
};
const getClient = () => {
return client;
};
module.exports.init = init;
module.exports.getClient = getClient;
app.js
//Import modules
require("dotenv").config({ path: __dirname + "/.env" });
const express = require("express");
const dogRoutes = require("./routes/dog.routes");
const db = require("./utils/db.util");
// Define PORT for HTTP Server
const PORT = 9900;
// Initialize Express
const app = express();
app.use(express.json());
app.use(dogRoutes);
(async () => {
await db.init();
app.listen(PORT, (err) => {
console.log(`Server is up at localhost ${PORT}`);
});
})();
关于mongodb - 没有 Mongoose 的 Express 和 MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71899948/