如何封装 Mongoose 连接数据库的代码?
约 828 字大约 3 分钟
2025-03-15
以下是一份完整的 Mongoose 连接数据库的封装代码,包含了连接管理、事件监听、错误处理和自动重连等功能。代码结构清晰,适合直接使用。
一、项目结构
project
db.js# 数据库连接封装文件
app.js# 应用入口文件
models
User.js# 用户模型
routes- user.js # 用户路由
二、代码实现
1、数据库连接文件 db.js
封装数据库连接逻辑:
const mongoose = require("mongoose");
// 数据库连接配置
const DB_URI = "mongodb://localhost:27017/mydatabase";
// 连接状态
let isConnected = false;
// 封装连接函数
async function connectDB() {
if (isConnected) {
console.log("Using existing database connection");
return;
}
try {
// 连接数据库
await mongoose.connect(DB_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
isConnected = true;
console.log("Database connected successfully");
} catch (err) {
console.error("Database connection error:", err);
// 重试连接
setTimeout(connectDB, 5000); // 5秒后重试
}
}
// 监听连接事件
mongoose.connection.on("connected", () => {
console.log("Mongoose connected to DB");
});
mongoose.connection.on("error", (err) => {
console.error("Mongoose connection error:", err);
});
mongoose.connection.on("disconnected", () => {
console.log("Mongoose disconnected from DB");
isConnected = false;
});
// 导出连接函数和 mongoose 实例
module.exports = { connectDB, mongoose };
2、定义用户模型:models/User.js
const { mongoose } = require("../db"); // 复用连接
// 定义用户模型
const userSchema = new mongoose.Schema({
name: String,
email: String,
});
// 导出模型
module.exports = mongoose.model("User", userSchema);
3、定义用户路由:routes/user.js
const express = require("express");
const User = require("../models/User");
const router = express.Router();
// 获取所有用户
router.get("/users", async (req, res) => {
try {
const users = await User.find();
res.json(users);
} catch (err) {
res.status(500).json({ error: "Failed to fetch users" });
}
});
// 创建用户
router.post("/users", async (req, res) => {
try {
const newUser = new User(req.body);
await newUser.save();
res.status(201).json(newUser);
} catch (err) {
res.status(500).json({ error: "Failed to create user" });
}
});
module.exports = router;
4、应用入口文件:app.js
const express = require("express");
const { connectDB } = require("./db"); // 导入封装的连接模块
const userRoutes = require("./routes/user"); // 导入用户路由
const app = express();
// 解析 JSON 请求体
app.use(express.json());
// 启动时连接数据库
connectDB()
.then(() => {
console.log("Database connection established");
})
.catch((err) => {
console.error("Failed to connect to database:", err);
process.exit(1); // 如果连接失败,退出应用
});
// 使用用户路由
app.use("/api", userRoutes);
// 启动服务器
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
三、运行项目
安装依赖:
npm install express mongoose
启动 MongoDB 服务(确保 MongoDB 已安装并运行)。
mongod # 启动 MongoDB 服务 mongo # 连接 MongoDB 数据库
运行应用:
node app.js
测试接口:
- 获取所有用户:
curl http://localhost:3000/api/users
- 创建用户:
curl -X POST http://localhost:3000/api/users -H "Content-Type: application/json" -d '{"name": "Alice", "email": "alice@example.com"}'
- 获取所有用户:
结束
6. 代码说明
db.js
:- 封装了 Mongoose 的连接逻辑,确保只连接一次数据库。
- 监听连接事件,支持自动重连。
models/User.js
:- 定义了用户模型,复用数据库连接。
routes/user.js
:- 定义了用户相关的路由,使用模型进行数据操作。
app.js
:- 应用入口文件,启动时连接数据库并加载路由。
7. 总结
通过以上代码,实现了以下目标:
- 避免频繁连接数据库:确保在整个应用生命周期中只连接一次数据库。
- 复用连接:在模型和路由中直接使用 Mongoose 的模型和方法。
- 自动重连:在连接断开时尝试自动重连,提高应用的健壮性。
这种封装方式不仅提高了代码的可维护性,还能有效避免因频繁连接数据库导致的性能问题。
更新日志
2025/8/24 08:17
查看所有更新日志
e7112
-1于