Node.js+Mongoose多集合CRUD实现遇缓冲超时错误求助
Node.js + Mongoose 多集合/多数据库CRUD操作超时问题解决
问题场景
新手练习Node.js + Mongoose实现CRUD操作,原有代码仅连接employees集合,新增sensors集合后,出现数据库操作缓冲超时错误。项目结构如下:
Node.js-Expess-MongoDB-CRUD-master ├─ project │ ├─ controllers │ │ ├─ employeeController.js │ │ └─ sensorController.js │ ├─ models │ │ ├─ db.js │ │ ├─ employee.model.js │ │ └─ sensor.model.js │ ├─ package-lock.json │ ├─ package.json │ ├─ server.js │ └─ views │ ├─ employee │ │ ├─ addOrEdit.hbs │ │ └─ list.hbs │ ├─ layouts │ │ └─ mainLayout.hbs │ └─ sensor │ ├─ addOrEdit.hbs │ └─ list.hbs └─ README.md
原有db.js代码:
const mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1:27017/EmployeeDB', { useNewUrlParser: true, useUnifiedTopology: true}, (err) => { if (!err) { console.log('MongoDB Connection Succeeded.') } else { console.log('Error in DB connection : ' + err) } }); require('./employee.model');
修改后的db.js代码:
const mongoose = require('mongoose'); const conn = mongoose.createConnection('mongodb://127.0.0.1:27017/EmployeeDB' , { useNewUrlParser: true, useUnifiedTopology: true}, (err) => { if (!err) { console.log('MongoDB Connection Succeeded.') } else { console.log('Error in DB connection : ' + err) } } ); const EmployeeModel = conn.model('EmployeeModel', require('./employee.model')); require('./employee.model'); const conn2 = mongoose.createConnection('mongodb://127.0.0.1:27017/SensorDB' , { useNewUrlParser: true, useUnifiedTopology: true}, (err) => { if (!err) { console.log('MongoDB Connection Succeeded.') } else { console.log('Error in DB connection : ' + err) } } ); const SensorModel =conn2.model('SensorModel', require('./sensor.model')); module.exports = {conn, EmployeeModel, conn2,SensorModel};
运行后出现错误:
$ node server.js Express server started at port : 3000 MongoDB Connection Succeeded. MongoDB Connection Succeeded. Error in retrieving employee list :MongooseError: Operation `employees.find()` buffering timed out after 10000ms Error during record insertion : MongooseError: Operation `employees.insertOne()` buffering timed out after 10000ms Error in retrieving sensor list :MongooseError: Operation `sensors.find()` buffering timed out after 10000ms Error during record insertion : MongooseError: Operation `sensors.insertOne()` buffering timed out after 10000ms Error during record insertion : MongooseError: Operation `sensors.insertOne()` buffering timed out after 10000ms Error during record insertion : MongooseError: Operation `sensors.insertOne()` buffering timed out after 10000ms Error in retrieving sensor list :MongooseError: Operation `sensors.find()` buffering timed out after 10000ms
问题原因
- 模型与数据库连接未正确绑定:修改后的代码使用
createConnection创建独立连接,但模型定义或引入方式错误,导致数据库操作无法关联到正确的连接,触发缓冲超时。 - 服务器启动时机不当:Express服务器在数据库连接未完全就绪时就开始处理请求,导致初期操作失败。
解决方法
方案1:两个集合共用同一个数据库(推荐新手使用)
这种方式更简单,无需多连接,只需在同一数据库下创建两个集合。
1.1 修正db.js
const mongoose = require('mongoose'); // 单数据库连接 mongoose.connect('mongodb://127.0.0.1:27017/EmployeeDB', { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('MongoDB Connection Succeeded.')) .catch(err => console.log('Error in DB connection : ' + err)); // 导出绑定好的模型 module.exports = { Employee: require('./employee.model'), Sensor: require('./sensor.model') };
1.2 修正模型文件
employee.model.js:
const mongoose = require('mongoose'); const employeeSchema = new mongoose.Schema({ name: { type: String, required: true }, position: String, office: String, salary: Number }); // 绑定到全局连接,创建并导出模型 module.exports = mongoose.model('Employee', employeeSchema);
sensor.model.js:
const mongoose = require('mongoose'); const sensorSchema = new mongoose.Schema({ sensorId: { type: String, required: true }, type: String, location: String, value: Number }); module.exports = mongoose.model('Sensor', sensorSchema);
1.3 修正控制器中的模型引入
employeeController.js示例:
const { Employee } = require('../models/db'); exports.list = (req, res) => { Employee.find() .then(employees => res.render('employee/list', { employees })) .catch(err => { console.log('Error in retrieving employee list :' + err); res.status(500).send('获取员工列表失败'); }); };
sensorController.js同理,替换为Sensor模型即可。
1.4 确保数据库连接就绪后启动服务器
修改server.js:
const express = require('express'); const app = express(); const mongoose = require('mongoose'); // 先完成数据库连接,再启动服务器 mongoose.connect('mongodb://127.0.0.1:27017/EmployeeDB', { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => { const port = 3000; app.listen(port, () => { console.log(`Express server started at port : ${port}`); }); }) .catch(err => { console.log('DB connection failed:', err); process.exit(1); });
方案2:使用两个独立数据库(EmployeeDB和SensorDB)
如果确实需要分开两个数据库,需确保每个模型严格绑定到对应的连接。
2.1 修正db.js
const mongoose = require('mongoose'); // 连接EmployeeDB const employeeConn = mongoose.createConnection('mongodb://127.0.0.1:27017/EmployeeDB', { useNewUrlParser: true, useUnifiedTopology: true }); employeeConn.on('connected', () => console.log('EmployeeDB Connection Succeeded.')); employeeConn.on('error', err => console.log('Error in EmployeeDB connection : ' + err)); // 连接SensorDB const sensorConn = mongoose.createConnection('mongodb://127.0.0.1:27017/SensorDB', { useNewUrlParser: true, useUnifiedTopology: true }); sensorConn.on('connected', () => console.log('SensorDB Connection Succeeded.')); sensorConn.on('error', err => console.log('Error in SensorDB connection : ' + err)); // 从模型文件导入Schema,绑定到对应连接创建模型 const EmployeeModel = employeeConn.model('Employee', require('./employee.model').schema); const SensorModel = sensorConn.model('Sensor', require('./sensor.model').schema); module.exports = { EmployeeModel, SensorModel };
2.2 修正模型文件(仅导出Schema)
employee.model.js:
const mongoose = require('mongoose'); const employeeSchema = new mongoose.Schema({ name: { type: String, required: true }, position: String, office: String, salary: Number }); // 仅导出Schema,由db.js绑定到对应连接 module.exports = { schema: employeeSchema };
sensor.model.js同理。
2.3 修正控制器中的模型引入
employeeController.js:
const { EmployeeModel } = require('../models/db'); // CRUD操作使用EmployeeModel即可
sensorController.js使用SensorModel。
2.4 等待所有连接就绪后启动服务器
修改server.js:
const express = require('express'); const app = express(); const { employeeConn, sensorConn } = require('./models/db'); // 等待两个数据库都连接成功 Promise.all([ new Promise(resolve => employeeConn.on('connected', resolve)), new Promise(resolve => sensorConn.on('connected', resolve)) ]) .then(() => { const port = 3000; app.listen(port, () => { console.log(`Express server started at port : ${port}`); }); }) .catch(err => { console.log('Failed to connect to databases:', err); process.exit(1); });
内容的提问来源于stack exchange,提问作者seungstrong
相关产品推荐
相关产品推荐

