JS中如何在MongoDB默认异步run函数外执行CRUD操作
解决方案
完全可以在run函数外实现MongoDB CRUD操作,原本的示例只是官方给的单次执行演示用代码,会在执行完查询后直接关闭数据库连接,没法直接复用,只要调整连接管理逻辑即可适配Express等场景,具体操作如下:
- 第一步:抽离MongoDB连接初始化逻辑,复用连接池(不要每次请求都新建、关闭连接,会产生极高性能开销)
可以单独封装一个db.js模块,代码示例:
const { MongoClient } = require('mongodb'); // 替换为自己的MongoDB连接地址 const uri = 'mongodb://localhost:27017'; const client = new MongoClient(uri); let dbInstance = null; // 初始化连接函数,只在服务启动时调用一次 async function connectDB() { if (dbInstance) return dbInstance; try { await client.connect(); dbInstance = client.db('sample_mflix'); console.log('MongoDB连接成功'); return dbInstance; } catch (err) { console.error('MongoDB连接失败:', err); process.exit(1); } } module.exports = { connectDB, getDB: () => dbInstance };
- 第二步:在Express入口文件中先初始化数据库连接,再启动服务
代码示例:
const express = require('express'); const { connectDB } = require('./db'); const app = express(); const port = 3000; // 解析post请求body参数 app.use(express.json()); // 启动服务前先初始化数据库连接 async function startServer() { await connectDB(); // 导入路由 const movieRoutes = require('./routes/movies'); app.use('/movies', movieRoutes); app.listen(port, () => { console.log(`Express服务运行在 http://localhost:${port}`); }); } startServer().catch(console.dir);
- 第三步:在路由文件中直接调用数据库实例执行CRUD操作
示例路由routes/movies.js代码:
const express = require('express'); const router = express.Router(); const { getDB } = require('../db'); // 查询标题为《回到未来》的电影接口 router.get('/back-to-the-future', async (req, res) => { try { const db = getDB(); const movies = db.collection('movies'); const query = { title: 'Back to the Future' }; const movie = await movies.findOne(query); res.json(movie); } catch (err) { res.status(500).json({ error: '查询失败', msg: err.message }); } }); // 新增电影接口示例 router.post('/', async (req, res) => { try { const db = getDB(); const movies = db.collection('movies'); const result = await movies.insertOne(req.body); res.json({ insertedId: result.insertedId }); } catch (err) { res.status(500).json({ error: '新增失败', msg: err.message }); } }); module.exports = router;
注意:不要在每个路由处理函数里单独调用
client.connect()和client.close(),MongoDB Node.js驱动自带连接池,全局复用同一个连接实例即可满足高并发请求需求,只需要在服务下线时手动关闭连接即可。
内容的提问来源于stack exchange,提问作者Psuedodoro
相关产品推荐
相关产品推荐

