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

Express+TypeScript项目中npm run dev时Mongoose连接失效问题排查

问题分析:Mongoose连接代码拆分后失效的原因与解决办法

我是TypeScript初学者,执行npm run dev后,Express服务器能成功连接到localhost:5000,但db/index.ts中的mongoose.connect无法正常工作;把这段连接代码移到server.ts里时,服务器和MongoDB都能正常连接,终端也会显示成功提示。请问问题出在哪里?能不能通过修改npm脚本来解决?


相关配置代码

package.json

{
  "scripts": {
    "start": "nodemon --watch '*.ts' --signal SIGTERM --exec ts-node server.ts",
    "build": "tsc -p .",
    "dev": "nodemon --watch \"src/**/*.ts\" --exec \"ts-node\" server.ts",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@tsconfig/node16-strictest-esm": "^1.0.3",
    "@types/cors": "^2.8.12",
    "@types/express": "^4.17.14",
    "@types/mongoose": "^5.11.97",
    "@types/node": "^18.7.19",
    "@typescript-eslint/eslint-plugin": "^5.38.0",
    "@typescript-eslint/parser": "^5.38.0",
    "eslint": "^8.24.0",
    "eslint-config-prettier": "^8.5.0",
    "eslint-plugin-prettier": "^4.2.1",
    "eslint-plugin-react": "^7.31.8",
    "nodemon": "^2.0.20",
    "prettier": "^2.7.1",
    "ts-node": "^10.9.1",
    "tsc-watch": "^5.0.3",
    "typescript": "^4.8.3"
  },
  "dependencies": {
    "cors": "^2.8.5",
    "dotenv": "^16.0.2",
    "express": "^4.18.1",
    "mongoose": "^6.6.1"
  }
}

tsconfig.json

{
  "extends": "@tsconfig/node16/tsconfig.json",
  "include": ["src/**/*", "bin/*"],
  "exclude": ["node_modules", "**/*.spec.ts"],
  "compilerOptions": {
    "rootDir": ".",
    "outDir": "dist",
    "typeRoots": ["node_modules/@types", "src/@types"]
  },
  "ts-node": {
    "files": true
  }
}

server.ts

import 'dotenv/config';
import { app } from './src/app';

const PORT = process.env.PORT || 5000;

app.listen(PORT, () => {
  console.log(`Successfully CONNECT. http://localhost:${PORT}`);
});

db/index.ts

import mongoose from 'mongoose';
const DB_URL =
  process.env.MONGODB_URL ||
  'MongoDB address is not set.\n check ./db/index.ts \n need .env \n';


mongoose.connect(DB_URL);
const db = mongoose.connection;

db.on('connected', () => console.log('connect success!!' + DB_URL));
db.on('error', (error) =>
  console.error('\n connect fail...\n' + DB_URL + '\n' + error),
);

终端运行截图

终端运行截图


问题原因

核心问题是**db/index.ts没有被实际导入执行**。当前server.ts只导入了./src/app,完全没有引入db/index.ts,所以这段MongoDB连接代码根本没被运行。而把代码移到server.ts里时,代码会随着server.ts的启动同步执行,自然就能连接成功。

另外,npm脚本dev的nodemon --watch "src/**/*.ts"只监听src目录下的文件,但db/index.ts在项目根目录,不在src范围内——不过这只是次要问题,核心还是代码未被导入触发执行。

解决办法

方法1:在入口文件中导入数据库连接模块

修改server.ts,添加对db/index.ts的导入,触发连接代码执行:

import 'dotenv/config';
import './db/index'; // 新增此行,启动时执行数据库连接
import { app } from './src/app';

const PORT = process.env.PORT || 5000;

app.listen(PORT, () => {
  console.log(`Successfully CONNECT. http://localhost:${PORT}`);
});

方法2:调整目录结构(可选)

如果希望保持目录结构统一,可将db文件夹移入src目录:

  1. 移动后路径变为src/db/index.ts
  2. 修改server.ts中的导入路径为./src/db/index
  3. 此时npm脚本的监听规则无需修改,因为已经覆盖src/**/*.ts

关于npm脚本的修改

单纯修改npm脚本无法解决核心问题,因为脚本仅负责监听文件变化和启动服务,不能替代代码导入逻辑。但如果需要nodemon监听db目录的文件变化,可以修改dev脚本:

"dev": "nodemon --watch \"src/**/*.ts\" --watch \"db/**/*.ts\" --exec \"ts-node\" server.ts"

但这只是让服务在db文件修改时重启,仍需确保db/index.ts被导入才能执行连接代码。


内容的提问来源于stack exchange,提问作者emillly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:55:29