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

Node.js+MySQL登录接口Postman请求超时无响应求助

问题分析与解决方案

看起来你的登录接口超时问题根源很明确——当密码不匹配时,你的代码没有返回任何响应,导致请求一直处于挂起状态,直到最终超时断开连接。

先看你的登录路由代码:

users.post('/login', (req, res) => {
  User.findOne({ where: { email: req.body.email } })
  .then(user => {
    if (user) {
      if (bcrypt.compareSync(req.body.password, user.password)) {
        let token = jwt.sign(user.dataValues, process.env.SECRET_KEY, { expiresIn: 1440 })
        res.send(token)
      }
      // 这里存在漏洞:密码不匹配时没有任何响应输出
    } else {
      res.status(400).json({ error: 'User does not exist' })
    }
  })
  .catch(err => {
    res.status(400).json({ error: err })
  })
})

当数据库查到用户,但输入的密码和存储的哈希密码不匹配时,代码进入了if (user)分支,却没进入bcrypt.compareSync为true的分支,此时没有任何res.send或res.status().json()调用,请求会一直等待服务器响应,直到超时。

修复步骤

1. 补充密码不匹配的响应逻辑

修改登录路由代码,在密码不匹配时返回明确的错误响应:

users.post('/login', (req, res) => {
  User.findOne({ where: { email: req.body.email } })
  .then(user => {
    if (user) {
      if (bcrypt.compareSync(req.body.password, user.password)) {
        let token = jwt.sign(user.dataValues, process.env.SECRET_KEY, { expiresIn: 1440 })
        res.send(token)
      } else {
        // 新增:密码不匹配时返回错误提示
        res.status(400).json({ error: 'Incorrect password' })
      }
    } else {
      res.status(400).json({ error: 'User does not exist' })
    }
  })
  .catch(err => {
    res.status(400).json({ error: err.message || 'Server error' })
  })
})

2. 额外排查点

除了核心问题,你还可以检查以下细节确保万无一失:

  • 确认注册时使用的bcrypt.hashSync(或异步版本)的哈希参数(比如rounds值)和登录时的compareSync完全一致
  • 检查process.env.SECRET_KEY是否正确配置,避免JWT签名时出现未捕获的错误
  • 可以在User.findOne的then分支里添加console.log,打印查到的用户信息和密码匹配结果,方便调试

修改后再用Postman测试,应该就能得到即时响应,不会再出现超时问题了。

内容的提问来源于stack exchange,提问作者Catalin A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:30:03