这与其说是一个问题,不如说是一个咨询请求.我找不到资源来判断我的方法的有效性,所以我想听听MongoDB专家的意见.

我在玩MongoDB,想出了这个中间件方法,将客户机传递给我的路由.我有一个快速中间件:

const addClientToRequest = async (req, _, next) => {
  const client = new MongoClient(uri);
  await client.connect();
  req.client = client;
  next();
};

app.use(addClientToRequest);

之后,我使用req.客户端在我的路径中访问我的数据库.

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客户端可以吗?

推荐答案

根据我的经验,我们总是定义一个单独的实用程序,在应用程序启动时加载连接池,然后重用这些连接.

在上述方法中,您似乎在 for each 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相关问答推荐

如何从文档列表的数组内部打印一个对象?

在提供的文档(_Id)之后和之前,是否有一个Mongo操作来获取已排序(和/或过滤)集合中的文档计数?

Golang中的Mongo中值运算

Mongo $sort然后$group,顺序能保证吗?

MongoDB 聚合 - 条件 $lookup 取决于字段是否存在

Mongoose updateMany 以及 Where 和 orWhere?

Spring Boot 升级后未映射 Mongo 模板结果

如何使用指南针连接到 mongodb replicaset (k8s)

在数据中只有月份和年份的 mongodb 中字符串的日期时间

从 kubectl exec 获取返回值到 powershell 脚本

Mongoose 和 MongoDB,如何在具有多个引用的两个模型之间创建关系?

Spring Data + MongoDB GridFS 可以通过 Repository 访问吗?

使用 mongodb 时是否需要规范化数据库?

Mongodb 仅在值唯一时插入,否则更新 - 在 node.js 中

如何根据_id删除文档?

如何将查询结果(单个文档)存储到变量中?

带有排序功能的mongoose findOne

mongo - Ruby连接问题

mongoosefind()不返回结果

Spring Data MongoDB - 在哪里以编程方式为 Mongo 集合创建索引?