Node.js" / login" DB错误

时间:2017-07-19 00:57:58

标签: node.js

我试图获得" true"来自哈希比较。但是当我编写一个在数据库中不存在的用户名时会出现问题。例如:如果没有" jack.33"作为用户名,它抛出mysql错误并停止服务器。如何阻止此错误或创建解决方案? 这是错误:

    throw err; // Rethrow non-MySQL errors
            ^
TypeError: Cannot read property 'password' of undefined


app.post("/login", function(request, response) {
        var username = request.body.username;
        var pass = request.body.pass;

        con.query("select password from user where username = " + "\"" + username + "\"",function (err, result) {
            if(err) throw err;
            var passer = result[0].password;
            bcrypt.compare(pass, passer, function (err, res) {
                console.log(res);
                if (res === true) {
                    response.send("success")
                }else{
                    response.send("nop")
                }
            });
        });
    });

2 个答案:

答案 0 :(得分:3)

您在那里遇到的错误没有被您的数据库驱动程序抛出。

TypeError: Cannot read property 'password' of undefined是代码期望某个对象不存在的属性时引发的典型错误。

您的SELECT查询可以返回0行或更多行,当没有返回任何内容时,我怀疑您的数据库驱动程序正在为您提供一个空数组[]。因此,[]的索引0将是undefined

现在undefined.password将因类似的错误而死亡,因为属性password不属于undefined对象。

示例:



var result = []; // Assume SELECT query returns 0 row.
result[0].password;




除了检查是否定义了err之外。您的代码还必须满足用户不存在的情况。

if result.length === 1这样的简单检查可以解决您的逻辑错误。

您可能想知道如果返回的行超过1行会怎样?除非您的数据库设计不正确,其中用户名不是唯一的,否则这通常是不可能的。换句话说,你有一个更大的问题。

答案 1 :(得分:1)

您还可以全局捕获所有未捕获的错误。

process.on('uncaughtException', function (err) {
    console.log('UNCAUGHT', err.stack);
});