我正在努力改善节点/快速应用中的错误处理,但略有失落。
例如,这是我要改进的一条路线:
app.get("/api/max-value", function (req, res) {
const shop_domain = req.query.shop;
if (shop) {
table = 'max_value_table';
condition = "shop='" + shop + "'";
store.getRow(table, condition, function (data) {
return res.json({
currencySymbol: data[0].currencySymbol,
currencyDecimal: data[0].currencyDecimal,
currencyAmount: data[0].currencyAmount,
})
});
}
});
store.getRow正在调用此函数,但错误处理会引发错误并使我的应用程序崩溃。
getRow:函数(表格,条件,cb){
var queryString = "SELECT * FROM " + table + " WHERE " + condition + ";";
console.log('mySQL getRow: ', queryString);
connection.query(queryString, function (err, result) {
if (err) {
throw err;
}
cb(result);
});
},
我要添加的是store.getRow函数的错误处理。如果函数运行并且MySQL db中不满足条件,则返回错误消息/像res.send()一样发送。
我应该修改if(err)做其他事情吗?
最佳答案
您可以首先重构您的代码段,这些代码段检索条目以返回Promise
。它避免了回调 hell ,并有助于编写更简洁的代码:
function getEntries(table, condition) {
return new Promise((resolve, reject) => {
var queryString = "SELECT * FROM " + table + " WHERE " + condition + ";";
connection.query(queryString, function (err, result) {
if (err) {
reject(err);
}
resolve(result);
});
});
}
这段代码的执行方式与以前相同,但是返回的是
Promise
而不是将回调作为参数。然后,您可以将业务逻辑与错误处理分开。当您阅读简洁的代码时,这将帮助您的函数“做一件事”:
// Business logic
function getShopMaxValue(req) {
const shop = req.query.shop;
if (shop) {
throw new Error("Shop is not defined");
}
const table = 'max_value_table';
const condition = "shop='" + shop + "'";
const entries = await store.getEntries(table, condition);
return formatEntries(entries);
}
function formatEntries(entries) {
return {
currencySymbol: entries[0].currencySymbol,
currencyDecimal: entries[0].currencyDecimal,
currencyAmount: entries[0].currencyAmount,
};
}
// Error Handling
app.get("/api/max-value", async function (req, res) {
try {
const maxValue = getShopMaxValue(req);
return res.json(maxValue);
}catch(e) {
return res.send(/* Error. */);
}
});
这样,代码更具可读性和可测试性。
您甚至可以通过创建类似于
getEntries
的函数为您指定表来走得更远。这样,检索条目的代码不必知道数据库的体系结构,并且可以避免由于表名输入错误而导致的错误。
关于javascript - 如何向 Node 添加错误处理/表达MySQL函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62175878/