Node.js从MongoDB查询记录无结果无报错且进程未终止求助
问题分析与解决方案
核心问题1:数据库连接未关闭,导致进程挂起
你在getBirthDaysPromise中通过MongoClient.connect建立了连接,但查询完成后没有调用db.close()关闭连接。MongoDB客户端连接会保持活跃状态,阻止Node.js进程自动退出,这就是程序执行未结束的直接原因。
核心问题2:错误处理逻辑存在缺陷
在getBirthDays的catch块中,你返回了[{error: error}],这会让async函数的Promise处于resolved状态而非rejected。驱动代码中的.catch(err => ...)永远不会触发,即使发生错误,你也只会在.then里拿到错误对象数组,无法进入catch分支捕获异常。
潜在问题3:查询条件可能不符合数据结构
find({dob: [date,month]})是精确匹配数组的查询方式,只有当dob字段存储的是[日,月]格式的数组时才会生效。如果dob是Date类型或其他结构(比如嵌套对象{day: x, month: y}),这个查询会返回空结果。
修改后的代码示例
修复连接关闭、错误处理和查询逻辑的版本
const getBirthDaysPromise = (date, month) => { return new Promise((resolve, reject) => { MongoClient.connect(URL, { useNewUrlParser: true, useUnifiedTopology: true }, (err, db) => { if (err) { console.log("DB CONNECTION ERROR"); return reject(err); } console.log("SUCCESS"); const dbo = db.db("reminders"); // 若dob是Date类型,提取日和月匹配;若为数组则替换为{dob: [date, month]} const query = { $expr: { $and: [ { $eq: [{ $dayOfMonth: "$dob" }, date] }, { $eq: [{ $month: "$dob" }, month] } ] } }; dbo.collection("reminders").find(query, { projection: { name: 1, gender: 1 } }).toArray((err, result) => { // 无论查询成功或失败,都关闭连接 db.close(); if (err) { console.log("data fetching error"); return reject(err); } resolve(result); }); }); }); }; const getBirthDays = async (date, month) => { try { const birthDays = await getBirthDaysPromise(date, month); return birthDays; } catch (error) { // 抛出错误,让外部catch能捕获到 throw error; } finally { console.log("DONE"); } }; module.exports = { getBirthDays };
驱动代码保持不变,现在可正确捕获错误:
MONGO_LIB.getBirthDays(1, 1) .then(data => { console.log(data); }).catch(err => { console.log(err); });
关键修改说明
- 添加
db.close():在toArray回调中,无论查询成功或失败都关闭数据库连接,确保进程能正常退出。 - 修正错误处理:将
catch块中的return [{error: error}]改为throw error,让Promise进入rejected状态,外部.catch可正确捕获错误。 - 优化查询条件:如果
dob是Date类型,使用$expr配合日期操作符提取日和月匹配,适配更通用的场景;若dob确实是[日,月]数组,将query改回{dob: [date, month]}即可。
内容的提问来源于stack exchange,提问作者kumarp
相关产品推荐
相关产品推荐

