MongoDB连接失败未被Promise捕获致应用崩溃问题求助
问题原因
你手动封装的Promise没有正确处理mongoose.connect本身抛出的Promise拒绝,导致认证失败时存在未被捕获的Promise异常,进而引发应用崩溃。mongoose.connect本身就返回标准Promise,无需手动重新封装。
解决方法
修改tryDB.js,直接使用mongoose.connect返回的Promise,移除手动创建的Promise逻辑:
const mongoose = require('mongoose'); require('dotenv').config(); const uri = process.env.MONGO_URI; // 直接使用mongoose.connect返回的Promise,无需手动封装 const connection = mongoose.connect(uri) .then(() => { // 连接成功时返回数据库连接对象 return mongoose.connection; }); module.exports = connection;
如果偏好async/await风格,也可以这么写:
const mongoose = require('mongoose'); require('dotenv').config(); const uri = process.env.MONGO_URI; const getConnection = async () => { try { await mongoose.connect(uri); return mongoose.connection; } catch (error) { // 先做一层错误处理,再抛出让上层捕获 throw error; } }; module.exports = getConnection();
验证效果
修改后,使用错误密码时,认证失败的错误会被tryCtrl.js中的.catch()正常捕获,不会导致应用崩溃,错误信息会被正常打印到控制台。
额外说明
- 新版本Mongoose(v6+)已默认启用
useNewUrlParser、useUnifiedTopology等必要选项,无需手动添加;若使用旧版本,建议在mongoose.connect中补充这些参数:mongoose.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true }) - 避免手动封装Promise处理Mongoose连接,官方提供的Promise已覆盖所有连接错误场景,包括认证失败、网络问题等。
内容的提问来源于stack exchange,提问作者forstack overflowizi
相关产品推荐
相关产品推荐

