MongoDB连接正常但调用db.collection报错不是函数,无法读取集合
报错原因
你封装的数据库连接函数返回的是Promise对象,业务代码中调用connect()时未添加await关键字等待异步执行完成,因此赋值给db变量的是Promise实例而非MongoDB数据库实例,自然不存在collection方法,触发类型错误。
修复步骤
1. 业务代码核心修改
在调用connect()方法前添加await关键字,同时建议增加异常捕获逻辑避免未处理的Promise rejection警告:
app.post('/posts', async (req,res)=>{ try { // 添加await等待异步连接返回数据库实例 let db = await connect(); let posts = req.body; let result = await db.collection('posts').insertOne(posts); // 按需返回响应 res.status(200).json({ success: true, data: result }) } catch (err) { console.error('操作失败:', err) res.status(500).json({ success: false, msg: '数据库操作失败' }) } })
2. 可选的db.js代码优化
现有db.js存在少量不规范写法,可同步调整避免后续隐患:
const { MongoClient } = require('mongodb'); let connection_string = 'mongodb+srv://username:password@cluster0.3ctoa.mongodb.net/myFirstDatabase?retryWrites=true&w=majority'; let client = new MongoClient(connection_string, { useNewUrlParser: true, useUnifiedTopology: true }); let db = null // 若你使用CommonJS规范导入模块,建议用module.exports导出,ES Module场景可保留原export default写法 module.exports = () => { return new Promise((resolve, reject) =>{ if (db && client.isConnected()){ return resolve(db) } client.connect(err => { if(err){ // 出错直接返回,避免执行后续逻辑 return reject("Error in connection " + err) } console.log("Success") db = client.db("posts") // 删除未声明的coll变量赋值,避免污染全局作用域 resolve(db) }); }) };
内容的提问来源于stack exchange,提问作者Jan Tuđan
相关产品推荐
相关产品推荐

