【发布时间】:2021-02-04 12:38:26
【问题描述】:
我正在为我的网络服务器使用 nodeJS。
我正在编写数据库 API 服务器,但想在没有查询条目时响应 404 错误。
但是 MariaDB NodeJS 连接器在没有查询结果时不会返回错误,它只是返回空行。
所以我用自定义错误来处理它。但是效果不好。
这是我的源代码。有什么问题?
function sendQueryError(res, err) {
console.log('Query error : ' + err + ' - ' + err.message + '(' + err.errno + ')')
var error = {
code: 400,
message: err.message
};
switch (err.errno) {
case 404:
error.code = 404;
error.message = 'No Entry';
break;
case 1062:
error.code = 409;
error.message = 'Already exists'
break;
case 1366:
error.code = 400;
error.message = 'Wrong value. Check following message : ' + err.message;
}
res.status(error.code);
res.setHeader('Content-Type', 'application/json');
var response = {
success: false,
error: {
code: error.code,
message: error.message
}
};
res.send(JSON.stringify(response, null, 2));
return;
}
async function selectDB(query, data) {
let conn;
var rows
try {
conn = await pool.getConnection();
if (data)
rows = await conn.query(query, data);
else
rows = await conn.query(query);
if (!rows[0]) // When there is no result for query
{
var err = new Error('No Entry');
err.errno = 404;
console.log(`Error 1`);
throw err;
}
console.log('Query success and return');
var result = {
success: true,
data: rows
}
} catch (err2) {
console.log(`Error 2`);
throw err2;
} finally {
if (conn) {
conn.end()
}
return result;
}
}
app.get('/Users/:UserId', async function(req, res) {
if (!authDB(req.header('Authorization'), res))
return;
if (!isNaN(req.params.UserId)) {
try {
var result = await selectDB('SELECT * FROM User WHERE userNum = ?', [req.params.UserId]);
console.log(`Received result = ${result}`);
res.send(JSON.stringify(result));
} catch (err) // last error catch
{
console.log(`Error 3`);
sendQueryError(res, err);
}
} else {
try {
var result = await selectDB('SELECT * FROM User WHERE id = ?', [req.params.UserId]);
res.send(JSON.stringify(result));
} catch (err) {
sendQueryError(res, err);
}
}
});
正如你在源代码中看到的,如果我用 UserID(Number) 查询,服务器会调用函数 selectDB 并尝试找到与 userID 对应的行。
当没有结果时,我期望的输出是“Error1 Error2 Error3”。
但实际上,输出是这样的。
错误 1 错误 2 收到的结果 = 未定义
所以我不明白为什么服务器不调用“last error catch”?
如果我在函数中抛出错误并且函数中不再有 catch,它应该将错误返回到调用该函数的函数之外。
我是不是做错了什么?
【问题讨论】:
标签: javascript node.js database error-handling