Javascript 即使发生错误,如何使NodeJ继续工作?
我正在构建一个简单的登录/注册应用程序。我正在测试登录部分。然而,每当我输入错误的登录名时,后端(用Javascript 即使发生错误,如何使NodeJ继续工作?,javascript,node.js,rest,mariadb,Javascript,Node.js,Rest,Mariadb,我正在构建一个简单的登录/注册应用程序。我正在测试登录部分。然而,每当我输入错误的登录名时,后端(用NodeJS和Express编写)就会崩溃并停止 以前,每当SQL返回如下错误时,我的代码就会抛出一个错误: con.query(“从表_name中选择*,其中username=“+usernameGiven,函数(er,结果){ if(er)投掷器; 返回结果; } 这是可行的,但如上所述存在问题。因此我删除了抛出器部分,并将其替换为console.log(er),但nodeJS仍将停止,进
NodeJS
和Express
编写)就会崩溃并停止
以前,每当SQL返回如下错误时,我的代码就会抛出一个错误:
con.query(“从表_name中选择*,其中username=“+usernameGiven,函数(er,结果){
if(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)
/home/x/CodeOver/LoginForm/api/node\u modules/mysql/lib/protocol/Parser.js:437
抛出错误;//重新抛出非MySQL错误
^
TypeError:无法读取未定义的属性“password”
在查询时。(/home/x/CodeOver/LoginForm/api/api.js:43:37)
在查询时。(/home/x/CodeOver/LoginForm/api/node\u modules/mysql/lib/Connection.js:526:10)
我建议进行一些重构,使代码对这种类型的故障更加健壮
在这种情况下,try..catch块实际上不会捕获查询错误,不过如果出现任何其他错误,我会将它们保留在那里
在查询时,我们还应该在这里使用参数。SQL注入攻击是个坏消息,使用参数也会降低查询导致语法错误的可能性
如果我们的用户名不存在,我也会提前失败并抛出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);
}
试着抓住它,然后继续我试过了,但它仍然显示了一个错误,我已经用错误日志的一部分编辑了这个问题。