【问题标题】:UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'password' of undefinedUnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“密码”
【发布时间】:2020-12-26 16:58:04
【问题描述】:

这是我的登录代码。比较用户输入的密码和存储的密码时出现未处理的承诺。

exports.login = (req, res) => {
  try {    
    const {email, password} = req.body
    console.log(req.body)

    if(!email || !password) {
      return res.status(400).render('login', {
        message: 'Please Provide an email and password'
      })
    }

    db.query('SELECT * FROM users WHERE email = ? ',{email}, async (error, results) => {
        console.log(error)
        console.log(results)
        if( !results || !(await bcrypt.compare(password, results[0].password)) ) {
          res.status(401).render('login', {
            message: 'Email or Password is Incorrect'
          })
      }
     })

  } catch (error) {
    console.log(error)
  }
}

Console.log(error) 为空..

更新

【问题讨论】:

    标签: javascript node.js async-await promise


    【解决方案1】:

    我建议你promisifydb.query 这样你就可以await 它,错误将被正确地捕获在catch 块中,并且你的代码将被展平。

    您的错误是由results[0] 引起的,即undefined 在尝试访问其password 属性时,这意味着results 是一个空数组。

    query 的第二个参数不应该是Object,而是Array,所以将{ email } 替换为[email]

    const {
        promisify
    } = require('util');
    
    const query = promisify(db.query.bind(db));
    
    exports.login = async (req, res) => {
        try {
            const {
                email,
                password
            } = req.body;
    
            if (!email || !password) {
                return res.status(400).render('login', {
                    message: 'Please Provide an email and password'
                });
            }
    
            const results = await query('SELECT * FROM users WHERE email = ? ', [email]); // problem occur due to usage of curly brackets.
                
            if (!results || !(await bcrypt.compare(password, results[0].password))) {
                res.status(401).render('login', {
                    message: 'Email or Password is Incorrect'
                });
            }
    
        } catch (error) {
            console.log(error);
        }
    }
    

    【讨论】:

    • 不起作用仍然无法读取 results[0].password 处的属性密码
    • 我也有同样的想法,但是我应该如何从数据库中获取数据而不是那个。
    • 我的回答并不能解决您的问题(我需要更多信息)它只是指出了为什么console.log(error) 对您不起作用(修复了UnhandledPromiseRejectionWarning),它建议问题的原因(可能是请求返回一个空数据集)
    • 您应该验证email 变量是从body 中正确提取的,验证您没有编码问题,并验证您在数据库中有一个与此精确的实际记录电子邮件地址。
    • console.log(results) 没有记录任何内容,这是否意味着我的查询没有从数据库中提取任何数据
    猜你喜欢
    • 2021-09-16
    • 2021-05-20
    • 2021-04-18
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2021-05-18
    • 2021-01-15
    相关资源
    最近更新 更多