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

使用Mongoose时出现TypeError: Cannot read properties of undefined (reading 'length')

向MongoDB写入数据时触发TypeError:Cannot read properties of undefined (reading 'length')

报错信息

C:\Users\tunji\Desktop\webdev\todolist-v2-starting-files\node_modules\mongoose\lib\model.js:3519
        for (let i = 0; i < error.writeErrors.length; ++i) {
                                              ^

TypeError: Cannot read properties of undefined (reading 'length')
    at C:\Users\tunji\Desktop\webdev\todolist-v2-starting-files\node_modules\mongoose\lib\model.js:3519:47
    at collectionOperationCallback (C:\Users\tunji\Desktop\webdev\todolist-v2-starting-files\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:133:26)
    at Timeout.<anonymous> (C:\Users\tunji\Desktop\webdev\todolist-v2-starting-files\node_modules\mongoose\lib\drivers\node-mongodb-native\collection.js:160:11)        
    at listOnTimeout (node:internal/timers:564:17)
    at process.processTimers (node:internal/timers:507:7)

我的代码

const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");

const app = express();
mongoose.connect('mongodb://localhost:27017/todolistDB');

app.set('view engine', 'ejs');

app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static("public"));

const itemsSchema = new mongoose.Schema({
  name: String
});

const Item = mongoose.model("Item", itemsSchema);

const item1 = new Item({name: "Workout"});
const item2 = new Item({name: "skydive"});
const item3 = new Item({name: "bungee"});

const defaultItems = [item1, item2, item3];

Item.insertMany(defaultItems, function(err){
  if (err){
    console.log(err + "yea");
  } else {
    console.log("good to go");
  }
});

app.get("/", function(req, res) {
  res.render("list", {listTitle: "Today", newListItems: items});
});

app.listen(3000, function() {
  console.log("Server started on port 3000");
});

已尝试操作

  • 确认MongoDB服务器正常运行
  • 删除并重装node_modules目录

解决方法

1. 修复数据库连接的异步问题

Mongoose连接数据库是异步操作,insertMany可能在连接未就绪时执行,导致错误。需将插入操作放在连接成功的回调内:

mongoose.connect('mongodb://localhost:27017/todolistDB', (err) => {
  if (err) {
    console.log('数据库连接失败:', err);
    return;
  }
  console.log('数据库连接成功');
  // 连接成功后再插入数据
  Item.insertMany(defaultItems, function(err){
    if (err){
      console.log(err);
    } else {
      console.log("默认数据插入成功");
    }
  });
});

2. 修复路由中的未定义变量

app.get路由中使用了未定义的items变量,需先从数据库查询数据再渲染页面:

app.get("/", function(req, res) {
  Item.find({}, (err, foundItems) => {
    if (err) {
      console.log(err);
    } else {
      res.render("list", {listTitle: "Today", newListItems: foundItems});
    }
  });
});

3. 确保Mongoose与MongoDB版本兼容

该错误常因旧版Mongoose与新版MongoDB驱动不兼容导致,建议更新Mongoose到最新版本:

npm install mongoose@latest

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:25:18