MongoDB无法插入文档,调用insertOne时报TypeError错误求助
问题分析与修复:MongoDB插入文档报错TypeError: Cannot read properties of undefined (reading 'insertOne')
问题描述
数据库已成功连接,但访问/testDB接口执行插入操作时,触发错误:TypeError: Cannot read properties of undefined (reading 'insertOne')
错误原因
connect函数无返回值:require('./components/mongodb').connect(config.dbUri)执行后,connect函数未返回任何值,导致mDB变量为undefined,调用mDB.insertOne自然报错。insertOne方法参数与调用不匹配:原insertOne方法定义需要collection和document两个参数,但接口中直接传入user对象,缺少集合名称;同时原方法未将结果通过回调传递给调用方。- 异步连接时序隐患:
MongoClient.connect是异步操作,若接口在连接完成前被调用,module.exports.client可能还未初始化。
修复代码
1. 修改./components/mongodb.js
重构为Promise风格,确保连接完成后再暴露可用操作方法,同时修正insertOne的参数和回调逻辑:
const MongoClient = require('mongodb').MongoClient; let dbInstance; module.exports.connect = async (uri) => { try { const client = await MongoClient.connect(uri, { useNewUrlParser: true }); dbInstance = client.db('PodToo'); console.log('Successfully connected to MongoDB'); return dbInstance; } catch (err) { console.error(`MongoDB connection error: ${err}`); process.exit(1); } }; module.exports.insertOne = async (collectionName, document) => { if (!dbInstance) { throw new Error('Database not connected'); } try { const result = await dbInstance.collection(collectionName).insertOne(document); console.log(`Successfully inserted document: ${result.insertedId}`); return result; } catch (error) { console.log(error); throw error; } };
2. 修改index.js
等待数据库连接完成后再启动服务,同时修正insertOne的调用方式:
const config = require('./config'); const express = require('express'); const app = express(); const mDB = require('./components/mongodb'); // 等待数据库连接完成后启动服务 (async () => { await mDB.connect(config.dbUri); app.get('/testDB', async (req, res) => { const user = { name: 'John', age: 30 }; try { const result = await mDB.insertOne('users', user); // 指定集合名称,示例为users console.log(`Successfully inserted user: ${result.insertedId}`); res.send("inserted"); } catch (error) { console.log(error); res.status(500).send('Insert failed'); } }); app.listen(3000, () => { console.log('App listening on port 3000'); }); })();
关键修复点说明
- 改用async/await处理MongoDB连接,确保服务启动前数据库已就绪
- 在
mongodb.js中维护dbInstance,避免重复获取数据库实例 - 修正
insertOne的参数传递,调用时明确指定集合名称 - 统一使用Promise风格处理异步操作,避免回调嵌套和时序问题
内容的提问来源于stack exchange,提问作者Russell Harrower
相关产品推荐
相关产品推荐

