我正在建立一个简单的登录/注册应用程序。 我正在测试登录部分。 但是,每当我输入错误的登录时,后端(用nodejs
和express
编写)就会崩溃并停止。
以前,每当SQL返回错误时,我的代码就会抛出一个错误,如下所示:
con.query("SELECT * FROM table_name WHERE username=" + usernameGiven, function(er, result) {
if (er) throw er;
return result;
}
这起作用了,但也有上面所说的问题。 因此,我删除了throw er
部分,并将其替换为console.log(er)
,但nodeJS仍然会停止,并且进一步的登录尝试将抛出cors
错误。
那么,我怎样才能阻止它做,让它只是记录它,然后继续下一个请求呢?
我尝试了try
和catch
,如下所示:
try {
con.query(sql_query, function(er, result) {
if (er) {
console.log(er);
}
response.json(result);
})
} catch (er) {
console.log(er);
}
但是,这仍然显示一个错误:
/home/x/CodeOver/LoginForm/api/node_modules/mysql/lib/protocol/Parser.js:437
throw err; // Rethrow non-MySQL errors
^
TypeError: Cannot read property 'password' of undefined
at Query.<anonymous> (/home/x/CodeOver/LoginForm/api/api.js:43:37)
at Query.<anonymous> (/home/x/CodeOver/LoginForm/api/node_modules/mysql/lib/Connection.js:526:10)
我建议进行一点重构,使代码对这种类型的故障更加健壮。
尝试。。 在这种情况下,catch块实际上不会捕获查询错误,但我会将它们留在那里以防出现任何其他错误。
我们在查询时也应该在这里使用参数。 SQL注入攻击是个坏消息,使用参数还会使查询不太可能导致语法错误。
如果UsernameGived不存在,我也会提前失败并抛出400错误。
这里是更新的代码,希望对你有所帮助!
try {
if (!usernameGiven) {
response.status(400).send("Bad Request");
return;
}
let sql_query = "select * from table_name where username = ?";
con.query(sql_query, [usernameGiven], function(er, result) {
if (er) {
console.error("Error occurred:", er);
response.status(500).send("Internal Server Error")
} else {
response.json(result);
}
})
} catch (er) {
console.error("Error occurred:", er);
}