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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:36:42