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
相关产品推荐
相关产品推荐

