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

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

问题原因

  1. 模型与数据库连接未正确绑定:修改后的代码使用createConnection创建独立连接,但模型定义或引入方式错误,导致数据库操作无法关联到正确的连接,触发缓冲超时。
  2. 服务器启动时机不当: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:40:02