MongoDB连接异常时Try Catch未触发错误返回问题排查
问题修复方案
错误原因分析
- 未执行数据库连接函数:主文件中
await connectDB仅引用了函数本身,未执行调用操作,导致MongoDB连接逻辑完全没触发,自然不会进入catch分支,服务器直接启动。 - 连接函数参数冗余无效:connectDB函数定义了
url参数,但内部硬编码使用connectionString,参数未发挥作用,同时调用时也未传入对应值。
修复步骤
1. 修正主文件启动逻辑
将await connectDB改为调用函数的形式,确保触发连接逻辑:
const express = require('express') const app = express() const tasks = require('./routes/tasks') const connectDB = require('./db/connect') // middleware app.use(express.json()) // routes app.get('/hello', (req, res) => { res.send('<h2>i know how to do things</h2>') }) app.post('/api/v1/tasks', tasks) app.use('/api/v1/tasks', tasks) const port = 3000; const start = async () => { try { // 调用connectDB函数执行连接 await connectDB() app.listen(port, () => console.log(`server is listening on port ${port}`)) } catch (error) { console.log('数据库连接失败:', error) } } start()
2. 调整connectDB文件函数定义
移除冗余的url参数,让函数内部直接使用预设的连接字符串:
const mongoose = require('mongoose') const connectionString = "mongodb+srv://user:password@foo.bar.mongodb.net/TASK-MANAGER?retryWrites=true&w=majority&appName=Cluster0" const connectDB = () => { return mongoose.connect(connectionString, { useNewUrlParser: true, useCreateIndex: true, useFindAndModify: false, useUnifiedTopology: true, }) } module.exports = connectDB
如果需要灵活传入连接字符串(推荐用于不同环境配置),可修改为以下形式:
// connectDB文件 const mongoose = require('mongoose') const connectDB = (url) => { return mongoose.connect(url, { useNewUrlParser: true, useCreateIndex: true, useFindAndModify: false, useUnifiedTopology: true, }) } module.exports = connectDB
同时在主文件中传入连接字符串:
// 主文件新增连接字符串定义 const connectionString = "mongodb+srv://user:password@foo.bar.mongodb.net/TASK-MANAGER?retryWrites=true&w=majority&appName=Cluster0" // 调用时传入参数 await connectDB(connectionString)
验证效果
修改密码测试错误场景时,现在会触发MongoDB连接失败,进入catch分支打印错误信息,且服务器不会启动。
内容的提问来源于stack exchange,提问作者Benjamin Walker
相关产品推荐
相关产品推荐

