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

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);
    });

关键修改说明

  1. 添加db.close():在toArray回调中,无论查询成功或失败都关闭数据库连接,确保进程能正常退出。
  2. 修正错误处理:将catch块中的return [{error: error}]改为throw error,让Promise进入rejected状态,外部.catch可正确捕获错误。
  3. 优化查询条件:如果dob是Date类型,使用$expr配合日期操作符提取日和月匹配,适配更通用的场景;若dob确实是[日,月]数组,将query改回{dob: [date, month]}即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 18:45:31