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

Node.js操作MongoDB异常:同逻辑函数一正常一无响应

问题:Node.js查询MongoDB时两个逻辑一致函数一个正常返回,另一个无返回且Promise未resolve

使用Node.js从MongoDB查询文档时出现异常:原本正常的获取文档功能,现在有两个逻辑完全一致的函数,其中getAll能返回集合数据,但getByQuery无任何返回,Promise也未resolve。已验证查询条件在MongoDB Compass中可正常执行,无报错,仅toArray的回调代码块未生效。

数据库文件代码

module.exports.getAll = (database, collection, query) => {
    return new Promise((resolve, reject) => {
        try {
            dbclient
                .db(database)
                .collection(collection)
                .find({ word: query })
                .toArray(function (err, results) {
                    if (err) {
                        reject(err)
                    }
                    resolve(results);
                })
        }
        catch (err) {
            reject(err);
        }
    })
}

module.exports.getByQuery = (database, collection, query) => {
    return new Promise((resolve, reject) => {
        try {
            dbclient
                .db(database)
                .collection(collection)
                .find({ word: query })
                .toArray(function (err, results) {
                    if (err) {
                        reject(err)
                    }
                    resolve(results);
                })
        }
        catch (err) {
            reject(err);
        }
    })
}

模型文件代码

module.exports.getByQuery = async (collection, query) => {
    return await mongoDB.getByQuery(config.mongoDB.databaseName, collection, query);
}

module.exports.getAll = async (collection, query) => {
    return await mongoDB.getAll(config.mongoDB.databaseName, collection, query)
}

控制器文件代码

console.log(await searchModel.getAll('InvertedIndex', 'положение'));
console.log(await searchModel.getByQuery('InvertedIndex', 'положение'));

排查步骤

1. 确认函数导出/导入的正确性

  • 检查数据库文件中getByQuery的导出拼写是否正确,模型文件中mongoDB.getByQuery的调用是否指向正确的函数
  • 验证控制器中searchModel的导入路径是否正确,确保getByQuery函数被正确加载

2. 修复Promise回调的错误处理逻辑

当前代码中toArray回调的错误处理没有终止后续代码,可能导致异常情况:

.toArray(function (err, results) {
    if (err) {
        return reject(err); // 添加return,避免后续resolve执行
    }
    resolve(results);
})

3. 改用MongoDB原生Promise API,简化代码并暴露错误

手动包裹Promise可能掩盖异步错误,直接使用驱动的Promise支持:

module.exports.getAll = async (database, collection, query) => {
    return await dbclient
        .db(database)
        .collection(collection)
        .find({ word: query })
        .toArray();
}

module.exports.getByQuery = async (database, collection, query) => {
    return await dbclient
        .db(database)
        .collection(collection)
        .find({ word: query })
        .toArray();
}

这样异步错误会直接抛出,便于捕获和排查。

4. 检查数据库连接状态

添加日志确认dbclient是否已成功连接:

// 在数据库文件的函数内添加
console.log('数据库连接状态:', dbclient.topology.isConnected()); // 适配MongoDB驱动版本

如果连接未建立,查询会卡住导致回调不触发,需确保dbclient在查询前已完成连接。

5. 添加函数执行日志,确认函数是否被调用

在数据库文件的两个函数内添加日志,确认getByQuery是否被正常触发:

module.exports.getByQuery = (database, collection, query) => {
    console.log('getByQuery已执行,参数:', database, collection, query);
    return new Promise((resolve, reject) => {
        // 原有代码
    })
}

如果日志未输出,说明函数未被调用,需排查模块导入或调用逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:43:13