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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 05:21:03