You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js/Express中间件中正确使用MongoDB Atlas连接?

MongoDB Atlas连接复用最佳实践(Node.js/Express环境)

环境

  • Node.js (18 LTS) / Express (^4.18.2)
  • MongoDB Native Driver (^4.12.0)
  • MongoDB Atlas (5.0.14)

项目结构

.github  
config  
 - mongodb_client.js  
dist  
middleware  
node_modules  
routes  
src
views
.env  
.gitignore
app.js  
package.json  
README.md  

官方连接代码

MongoDB Atlas提供的标准连接代码如下:

const { MongoClient, ServerApiVersion } = require('mongodb');

const uri = "mongodb+srv://admin:<password>@cluster0.******.mongodb.net/?retryWrites=true&w=majority";

const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });

client.connect(err => {
  const collection = client.db("test").collection("devices");
  // 在此执行集合操作
  client.close();
});

需求目标

官方代码在单个文件内完成连接和数据库调用,但我需要实现:

  • 单独创建一个存储MongoDB Atlas连接的文件(如mongodb_client.js)
  • 将连接实例导出,供中间件文件(如my_middleware_01.js)复用

伪代码示例:

config/mongodb_client.js

import { MongoClient, ServerApiVersion } from 'mongodb'; 

const connection_string = process.env.MONGODB_CONNECTION_STRING;

const mongodb_client = new MongoClient(connection_string, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });

// 导出连接实例
export { mongodb_client };

middleware/my_middleware_01.js

import { mongodb_client } from '../config/mongodb_client.js';

const api_myResource_get = async (req, res) => {
    mongodb_client.open();
    let collection = mongodb_client.db('myDatabase').collection('myCollection');
    let result = await collection.findOne(query, options);  
    res.json({ result: result });
    mongodb_client.close();  
}; 

export { api_myResource_get };

已尝试方案

一年前我曾解决过类似问题,但当前MongoDB驱动规范已更新:

  • 当前实例化客户端方式:
const client = new MongoClient(connection_string, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });
  • 旧版本方式:
await MongoClient.connect(connection_string);

我搜索了相关问题,但结果多基于旧规范,希望采用最新最佳实践。

尝试1:类封装连接(报错)

该方案返回错误:TypeError: Cannot read properties of null (reading 'db')

config/mongodb_connection.js

import { MongoClient, ServerApiVersion } from 'mongodb'; 

const connection_string = process.env.MONGODB_CONNECTION_STRING;

class mongodb_connection {
  static async open() {
    if (this.conn) return this.conn;
    this.conn = await MongoClient.connect(connection_string, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });
    return this.conn;
  }
}

mongodb_connection.conn = null;
mongodb_connection.url = connection_string;

export { mongodb_connection };

middleware/api_mongodb_get.js

import { mongodb_connection } from '../../config/mongodb_connection.js';

const api_mongodb_get = async (req, res) => {

    try {
        mongodb_connection.open();
        const collection = mongodb_connection.conn.db('pages').collection('pages');
        const result = await collection.findOne({ "my_key": "my value" }); 

        res.json({ data: result });
        mongodb_connection.close();
    } catch (error) {
        console.error(error);
        res.status(500).send(error);
    }

};

export { api_mongodb_get };

尝试2:直接导出客户端实例(可运行,但存疑)

该方案能正常运行,但不确定是否为最佳实践,是否存在潜在问题。

config/mongodb_connection.js

import { MongoClient, ServerApiVersion } from 'mongodb'; 

const connection_string = process.env.MONGODB_CONNECTION_STRING;

const mongodb_connection = new MongoClient(connection_string, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 });

export { mongodb_connection };

middleware/api_mongodb_get.js

import { mongodb_connection } from '../../config/mongodb_connection.js';

const api_mongodb_get = async (req, res) => {

    try {
            mongodb_connection.connect(async err => {  

                const collection = mongodb_connection.db('pages').collection('pages');
                const result = await collection.findOne({ "my_key": "my value" }); 

                res.json({ data: result });
                
                mongodb_connection.close();
            });
    } catch (error) {
        console.error(error);
        res.status(500).send(error);
    }

};

export { api_mongodb_get };

内容的提问来源于stack exchange,提问作者user1063287

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:40:32