Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何向node/express mySQL函数添加错误处理_Javascript_Mysql_Node.js_Express_Error Handling - Fatal编程技术网

Javascript 如何向node/express mySQL函数添加错误处理

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

我正在努力改进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.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. */);
    }
});