首页 > 解决方案 > TypeError:无法读取登录路径中未定义的属性“密码”

问题描述

当我使用 mysql DB 中不存在的电子邮件请求 api 时,它会引发错误,但在相反的情况下它会运行。

错误:

S:\#development\Pepperkart\pepperkart-backend\node_modules\mysql\lib\protocol\Parser.js:437
      throw err; // Rethrow non-MySQL errors
      ^

TypeError: Cannot read property 'password' of undefined
    at Query.db.query (S:\#development\Pepperkart\pepperkart-backend\routes\users.js:19:43)
    at Query.<anonymous> (S:\#development\Pepperkart\pepperkart-backend\node_modules\mysql\lib\Connection.js:525:10)
    at Query._callback (S:\#development\Pepperkart\pepperkart-backend\node_modules\mysql\lib\Connection.js:491:16)
    at Query.Sequence.end (S:\#development\Pepperkart\pepperkart-backend\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24)
    at Query._handleFinalResultPacket (S:\#development\Pepperkart\pepperkart-backend\node_modules\mysql\lib\protocol\sequences\Query.js:139:8)
    at Query.EofPacket (S:\#development\Pepperkart\pepperkart-backend\node_modules\mysql\lib\protocol\sequences\Query.js:123:8)
    at Protocol._parsePacket (S:\#development\Pepperkart\pepperkart-backend\node_modules\mysql\lib\protocol\Protocol.js:291:23)
    at Parser._parsePacket (S:\#development\Pepperkart\pepperkart-backend\node_modules\mysql\lib\protocol\Parser.js:433:10)
    at Parser.write (S:\#development\Pepperkart\pepperkart-backend\node_modules\mysql\lib\protocol\Parser.js:43:10)
    at Protocol.write (S:\#development\Pepperkart\pepperkart-backend\node_modules\mysql\lib\protocol\Protocol.js:38:16)
[nodemon] app crashed - waiting for file changes before starting...

我的 api 看起来像这样:

router.post('/login', (req, res) => {
    var email = req.body.email
    var password = req.body.password

    var GRAB_USER = `SELECT * FROM user_details WHERE email = ?`
    db.query(GRAB_USER, email, (err, result) => {
        if (err) {
            res.send('email not found')
        } else {
            var user = result[0]

            bcrypt.compare(password, user.password, (err, match) => {
                if (err) {
                    res.send('password not match')
                } else {
                    res.send(user)
                }
            });
        }
    })
})

标签: mysqlnode.js

解决方案


您的查询很好并且没有给出错误,因此您还应该检查result.length> 0然后res.send('email not found')

router.post('/login', (req, res) => {
  var email = req.body.email
  var password = req.body.password

  var GRAB_USER = `SELECT * FROM user_details WHERE email = ?`
  db.query(GRAB_USER, email, (err, result) => {
    if (err) {
        res.send('email not found')
    } 
    else if (result.length==0) {
      res.send('email not found') //this is what you are missing
    }
    else {
      var user = result[0]

      bcrypt.compare(password, user.password, (err, match) => {
        if (err) {
          res.send('password not match')
        } else {
          res.send(user)
        }
      });
    }
  })
})

推荐阅读