Mongoose声明查询后代码停滞,请求无响应如何修复?
问题排查与修复方案
你遇到的问题是代码卡在了console.log("test 0")之后,无法走到test 1,核心原因是Mongoose的sort()方法调用方式错误,导致查询构建过程中出现了未被捕获的异常,让代码执行流程中断了。
1. 问题根源
Mongoose从4.x版本之后,sort()方法不再支持.sort(fieldName, direction)这种参数形式,你当前写的.sort('username', 1)是已废弃的用法,这会导致代码在构建查询对象时卡住,甚至抛出未被处理的Promise拒绝,自然无法执行到后续的console.log("test 1")。
2. 直接修复代码
把sort的调用改成对象格式即可:
let query = User.find().sort({ username: 1 }).skip(req.query.skip || 0).limit(req.query.limit || 20)
3. 额外优化建议(避免后续踩坑)
除了修复sort的问题,还有几个细节可以优化,让代码更健壮:
- 完善错误捕获范围:原来的try/catch只包裹了
query.exec(),但构建查询的过程(比如sort的错误)没被覆盖,建议把整个admin分支的查询逻辑都放进try/catch里:if (adminState) { console.log("test 0") try { let query = User.find().sort({ username: 1 }).skip(req.query.skip || 0).limit(req.query.limit || 20) console.log("test 1") const users = await query.exec() // 别忘了返回查询结果给客户端,否则请求会一直挂起 res.json(users) } catch (err) { console.error("获取用户列表失败:", err) res.status(500).json({ error: "获取用户列表失败,请稍后重试" }) } } - 给
isAdmin函数添加错误处理:如果查找用户时出现数据库错误,当前代码会导致未处理的Promise拒绝,建议加上try/catch:async function isAdmin(id) { try { const currentUser = await User.findById(id) return currentUser && currentUser.role === "Administrateur" } catch (err) { console.error("验证管理员身份出错:", err) return false } } - 用
const/let替代var:尽量使用块级作用域的变量声明,避免变量提升带来的潜在问题。
内容的提问来源于stack exchange,提问作者Léo Coletta
相关产品推荐
相关产品推荐

