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
相关产品推荐
相关产品推荐

