我已经阅读了几个在 node.js 中使用 mysql 的示例,并且我对错误处理有疑问。
大多数示例都像这样进行错误处理(可能为简洁起见):
app.get('/countries', function(req, res) {
pool.createConnection(function(err, connection) {
if (err) { throw err; }
connection.query(sql, function(err, results) {
if (err) { throw err; }
connection.release();
// do something with results
});
});
});
这会导致服务器在每次出现 sql 错误时崩溃。我想避免这种情况并保持服务器运行。
我的代码是这样的:
app.get('/countries', function(req, res) {
pool.createConnection(function(err, connection) {
if (err) {
console.log(err);
res.send({ success: false, message: 'database error', error: err });
return;
}
connection.on('error', function(err) {
console.log(err);
res.send({ success: false, message: 'database error', error: err });
return;
});
connection.query(sql, function(err, results) {
if (err) {
console.log(err);
res.send({ success: false, message: 'query error', error: err });
return;
}
connection.release();
// do something with results
});
});
});
我不确定这是否是处理它的最佳方法。我还想知道查询的 err
块中是否应该有一个 connection.release()
。否则,连接可能会保持打开状态并随着时间的推移而建立。
我已经习惯了 Java 的 try...catch...finally
或 try-with-resources
在这里我可以“干净地”捕获任何错误并在最后关闭我的所有资源。有没有办法传播错误并在一个地方处理它们?
原文由 Dave 发布,翻译遵循 CC BY-SA 4.0 许可协议
我决定使用 es2017 语法和 Babel 来处理它以转换为 Node 7 支持的 es2016。
较新版本的 Node.js 无需转译即可支持此语法。
这是一个例子:
使用
async
/await
连同这个try { try { } finally { } } catch { } pattern
可以进行干净的错误处理,您可以在一个地方收集和处理所有错误。 finally 块无论如何都会关闭数据库连接。你只需要确保你一直在处理承诺。对于数据库访问,我使用
promise-mysql
模块而不是普通的mysql
模块。对于其他一切,我使用bluebird
模块和promisifyAll()
。我也有自定义的异常类,我可以在某些情况下抛出,然后在 catch 块中检测它们。根据 try 块中可能引发的异常,我的 catch 块可能如下所示:
池.js:
错误.js: