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

MongoDB无法插入文档,调用insertOne时报TypeError错误求助

问题分析与修复:MongoDB插入文档报错TypeError: Cannot read properties of undefined (reading 'insertOne')

问题描述

数据库已成功连接,但访问/testDB接口执行插入操作时,触发错误:TypeError: Cannot read properties of undefined (reading 'insertOne')

错误原因

  1. connect函数无返回值:require('./components/mongodb').connect(config.dbUri)执行后,connect函数未返回任何值,导致mDB变量为undefined,调用mDB.insertOne自然报错。
  2. insertOne方法参数与调用不匹配:原insertOne方法定义需要collection和document两个参数,但接口中直接传入user对象,缺少集合名称;同时原方法未将结果通过回调传递给调用方。
  3. 异步连接时序隐患: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:50:27