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

Node.js连接MongoDB成功后无法访问集合的问题求助

Node.js连接MongoDB后访问集合的问题解决

错误原因分析

  • 异步执行顺序问题:MongoClient.connect是异步操作,你在连接回调外直接访问db变量时,连接还未完成,db仍为undefined,这是触发Cannot read properties of undefined (reading 'Collection')报错的核心原因。
  • 方法名大小写错误:MongoDB获取集合的方法是小写的collection(),而非大写的Collection()。

修正后的代码

回调函数版本

var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';

MongoClient.connect(url, function (err, database) {
    if (err) {
        console.error('MongoDB 연결 실패', err);
        return;
    }
    console.log("DB연결 성공");

    // 必须在连接成功的回调内操作集合
    var movies = database.collection('test');
    // 示例:插入单条数据
    movies.insertOne({ title: "测试电影" }, function (insertErr, result) {
        if (insertErr) {
            console.error('插入失败', insertErr);
            return;
        }
        console.log('插入成功,文档ID:', result.insertedId);
        // 操作完成后按需关闭连接
        database.close();
    });
});

Async/Await版本(推荐,更简洁)

如果你的Node.js版本支持ES6+语法,建议使用async/await写法避免回调嵌套:

const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017/test';

async function main() {
    let database;
    try {
        // 等待连接完成
        database = await MongoClient.connect(url);
        console.log("DB연결 성공");
        
        // 获取集合
        const movies = database.collection('test');
        // 插入示例数据
        const result = await movies.insertOne({ title: "测试电影" });
        console.log('插入成功,文档ID:', result.insertedId);
    } catch (err) {
        console.error('操作失败', err);
    } finally {
        // 确保连接被关闭,避免资源泄漏
        if (database) {
            await database.close();
        }
    }
}

main();

核心注意事项

  • 所有数据库操作必须放在连接成功的回调函数内,或通过async/await确保连接完成后再执行。
  • 严格区分MongoDB API的方法大小写,集合获取方法是collection()(小写c)。
  • 操作完成后按需关闭数据库连接,避免长期占用资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:15:36