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

如何优化我的TypeScript中Mongoose数据库连接?

Mongoose数据库连接代码优化建议

你的基础连接逻辑是可行的,但可以从配置管理、异步流程、稳定性、类型安全等方面做优化,具体建议如下:

  • 抽离硬编码配置,使用环境变量管理
    把数据库连接字符串这类敏感/可变配置从代码中抽离,用环境变量管理,既提升安全性又方便不同环境(开发/测试/生产)切换。可以借助dotenv包实现:

    1. 安装依赖:npm install dotenv @types/dotenv --save-dev
    2. 项目根目录创建.env文件:
      MONGO_URI=mongodb://0.0.0.0:27017/adsis-books
      
    3. 修改代码加载环境变量并使用:
      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()
      
    4. 在入口文件(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:35:23