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目录:
- 移动后路径变为
src/db/index.ts - 修改
server.ts中的导入路径为./src/db/index - 此时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
相关产品推荐
相关产品推荐

