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

