javascript - 如何向 Node 添加错误处理/表达MySQL函数

标签 javascript mysql node.js express error-handling

我正在努力改善节点/快速应用中的错误处理,但略有失落。

例如,这是我要改进的一条路线:

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/

相关文章:

Javascript对象成员重新赋值

javascript - 在 JavaScript 和 PHP 之间传递语言字符

php - 简单的mysql查询

javascript - 使用 Node 打开 MATLAB GUI

python - Moongoose 和 dict 转换为数组失败

javascript - Ember.JS - 如何在同一页面中使用多个模型、 Controller 和 View ?

javascript - 如何获取div内的图片url

python - mysql - 如何确保使用flask-sqlalchemy 在 Flask 中成功连接 mysql 数据库?

mysql - 从一个表复制到另一个表,如何对整个数据集而不是单独的行强制执行外键检查?

mysql - 无法将 WKB 插入 MySQL 中的 POINT 列