Javascript 如何向node/express mySQL函数添加错误处理
我正在努力改进node/express应用程序中的错误处理,但有点迷失了方向 例如,以下是我想要改进的路线:Javascript 如何向node/express mySQL函数添加错误处理,javascript,mysql,node.js,express,error-handling,Javascript,Mysql,Node.js,Express,Error Handling,我正在努力改进node/express应用程序中的错误处理,但有点迷失了方向 例如,以下是我想要改进的路线: app.get("/api/max-value", function (req, res) { const shop_domain = req.query.shop; if (shop) { table = 'max_value_table'; condition = "shop='" + shop + "'"; store
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){
},
我要添加的是store.getRow函数的错误处理。如果函数运行且MySQL db返回错误消息/send中的条件未满足,则与res.send()类似
我是否应该修改if(err)以执行其他操作?这完全取决于您使用哪个方法或库连接数据库 1.使用错误优先回调
con.query("SELECT * FROM customers", function (err, result, fields) {
if (err) {
//you will received error over here. and you can handle as per your continent.
}
console.log(result);
});
二,。如果您正在使用某个库连接数据库(例如sequelize)(通过promise)
三,。使用异步/等待(ES7)
我认为这将有助于你解决问题 您可以首先重构检索条目的代码段,以返回一个
承诺
。它避免了回调地狱,有助于编写更干净的代码:
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
,为您指定表。通过这种方式,检索条目的代码不必知道数据库的体系结构,并且可以避免由于键入错误的表名而导致的错误。确实store.getRow
返回承诺?@Baboo\ui使用您请求的信息更新了问题。谢谢克里斯,谢谢你。我刚刚更新了问题。不确定这是否会改变您的答案。事实上,您应该有适当的方法处理应用程序上的异常。请遵循此URL,它包含所有最佳实践,同时使用节点,包括异常处理哇!谢谢你的回答。我将尝试实现这一点。谢谢。如果它解决了你的问题,请考虑接受答案。它帮助其他开发人员找到类似问题的解决方案,并奖励花时间回答您的开发人员;)我一定会的。再次感谢!
try {
const data = await store.getRow(table, condition);
return res.json({
currencySymbol: data[0].currencySymbol,
currencyDecimal: data[0].currencyDecimal,
currencyAmount: data[0].currencyAmount,
})
} catch(err => {
//you will received error over here. and you can handle as per your continent.
});
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);
});
});
}
// 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. */);
}
});