我试图获得" 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")
}
});
});
});
答案 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);
});