如何在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
相关产品推荐
相关产品推荐

