如何优化我的TypeScript中Mongoose数据库连接?
Mongoose数据库连接代码优化建议
你的基础连接逻辑是可行的,但可以从配置管理、异步流程、稳定性、类型安全等方面做优化,具体建议如下:
抽离硬编码配置,使用环境变量管理
把数据库连接字符串这类敏感/可变配置从代码中抽离,用环境变量管理,既提升安全性又方便不同环境(开发/测试/生产)切换。可以借助dotenv包实现:- 安装依赖:
npm install dotenv @types/dotenv --save-dev - 项目根目录创建
.env文件:MONGO_URI=mongodb://0.0.0.0:27017/adsis-books - 修改代码加载环境变量并使用:
import express from 'express' import mongoose from 'mongoose' import { routes } from './routes' import dotenv from 'dotenv' // 加载环境变量 dotenv.config() class App { public express: express.Application public constructor() { this.express = express() this.middleware() this.routes() } public middleware(): void { this.express.use(express.json()) } // 将数据库连接改为返回Promise的方法 public async connectDatabase(): Promise<void> { try { mongoose.set("strictQuery", true) // 从环境变量获取连接字符串 await mongoose.connect(process.env.MONGO_URI!) console.log("Database connected successfully") } catch (error) { console.error('Failed to connect to database:', error) // 连接失败时退出进程,避免服务处于不健康状态 process.exit(1) } } public routes(): void { this.express.use(routes) } } export default new App() - 在入口文件(比如
server.ts)中等待连接完成再启动服务:import app from './app' const PORT = process.env.PORT || 3000 async function startServer() { await app.connectDatabase() app.express.listen(PORT, () => { console.log(`Server running on port ${PORT}`) }) } startServer()
- 安装依赖:
完善Mongoose连接配置,提升稳定性
除了strictQuery,可以添加更多连接选项来优化连接池、超时等参数,避免因网络波动导致的连接问题:await mongoose.connect(process.env.MONGO_URI!, { maxPoolSize: 10, // 连接池最大连接数 serverSelectionTimeoutMS: 5000, // 服务器选择超时时间 socketTimeoutMS: 45000, // Socket超时时间 })处理进程退出时的连接关闭
监听进程退出信号,主动关闭Mongoose连接,避免资源泄漏:// 在connectDatabase方法中添加 process.on('SIGINT', async () => { await mongoose.disconnect() console.log('Database connection closed due to app termination') process.exit(0) }) process.on('SIGTERM', async () => { await mongoose.disconnect() console.log('Database connection closed due to app termination') process.exit(0) })增强类型安全
为环境变量添加类型声明,避免process.env.MONGO_URI的空值风险:
创建types/env.d.ts文件:declare namespace NodeJS { interface ProcessEnv { MONGO_URI: string PORT?: string } }这样TypeScript会识别环境变量的类型,不用再用
!断言非空。优化异步初始化流程
原代码中在constructor里调用async的database()方法,但constructor不能是async的,会导致app启动时数据库可能还未连接完成就开始处理请求。通过将连接逻辑抽离到独立方法,在启动服务前等待连接完成,确保服务就绪后再处理请求。
内容的提问来源于stack exchange,提问作者Aftermatch CSGO
相关产品推荐
相关产品推荐

