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

Express连接MongoDB时出现TypeError: Cannot read properties of undefined (reading 'collection')错误

解决Express连接MongoDB时的TypeError: Cannot read properties of undefined (reading 'collection')错误

问题根源

你遇到的错误是因为数据库连接是异步操作,而你的代码逻辑是先启动Express服务器,再去连接MongoDB。当/user接口在数据库连接完成前被请求时,database变量还处于初始的undefined状态,调用database.collection()自然会抛出这个类型错误。

修复方案

方案1:数据库连接成功后再启动服务器

这是最稳妥的方式,确保所有接口在数据库就绪后才能被访问:

const Express = require('express')
const app = Express()
const cors = require('cors')
app.use(cors());
const MongoClient = require('mongodb').MongoClient

let database;

// 先连接数据库,成功后再启动服务器
MongoClient.connect('mongodb://localhost:27017/chips', (err, client) => {
    if (err) {
        console.error('数据库连接失败:', err);
        process.exit(1);
    }
    database = client.db('chips');
    console.log('已连接到数据库');
    
    app.listen(5000, () => {
        console.log('服务器运行在端口5000');
    });
});

app.get('/user', (request, response) => {
    database.collection('users').find({}).toArray((err, results) => {
        if (err) {
            return response.status(500).send('查询失败: ' + err.message);
        }
        response.send(results);
    });
});

方案2:用Async/Await优化异步逻辑(推荐)

使用现代的async/await语法让异步代码更易读,同时保留先启动服务器的逻辑:

const Express = require('express')
const app = Express()
const cors = require('cors')
app.use(cors());
const MongoClient = require('mongodb').MongoClient

let database;

// 封装数据库连接为异步函数
async function connectDB() {
    try {
        const client = await MongoClient.connect('mongodb://localhost:27017/chips');
        database = client.db('chips');
        console.log('已连接到数据库');
    } catch (err) {
        console.error('数据库连接失败:', err);
        process.exit(1);
    }
}

// 启动数据库连接
connectDB();

app.get('/user', async (request, response) => {
    // 检查数据库是否就绪
    if (!database) {
        return response.status(503).send('数据库暂未连接,请稍后重试');
    }
    
    try {
        const results = await database.collection('users').find({}).toArray();
        response.send(results);
    } catch (err) {
        response.status(500).send('查询失败: ' + err.message);
    }
});

app.listen(5000, () => {
    console.log('服务器运行在端口5000');
});

额外提示

  • 永远不要忽略错误处理:连接数据库或查询数据时的错误必须捕获并处理,避免程序崩溃或静默失败。
  • 生产环境建议:把MongoDB连接字符串放到环境变量中,不要硬编码在代码里,提升安全性和灵活性。

内容的提问来源于stack exchange,提问作者Johannes Mwasanyila J Chriss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 23:22:17