【发布时间】:2014-04-22 11:54:09
【问题描述】:
在 node.js + sqlite3 中:
什么是从回调通知调用者错误并让调用者重试的好方法?当我们遇到数据库锁定错误时 - 想再次尝试运行查询。
TestController.prototype.addDevices = function (number_of_devices, callback_after_all_devices_have_been_added) {
var controller = this;
var db = controller.connectToDb();
for(i = 0; i < number_of_devices; i++) {
db.each("SELECT api_key as ak FROM user_table ORDER BY RANDOM() LIMIT 1", function(err, row) {
//sometimes we get a SQLITE: database locked error
if (err !== null) {
console.log("Error found");
//i-- this will not work - but how do we do it then?
return;
}
console.log("Error: " + err);
//code to process if we get an entry from the user_table ..
});
}
}
【问题讨论】:
-
由于 for 循环,您会遇到数据库锁定错误。 for 循环不会等待 db.each 完成。在调用 db.each 之后,它会继续进行下一次迭代。
-
但我想为指定数量的设备(即 for 循环中的计数器)执行 db.each - 我有时会锁定数据库,而且只有十分之一(通常在第一次尝试)
-
您可以查看 async.eachSeries(异步模块)以确保 db.each 在继续下一个之前完成。由于您的问题是关于如何重试,您可以查看 node-retry 模块,它允许您在失败前重试 x 次。
-
谢谢!将查看您提到的模块 - 如果我可以使用这些模块解决问题,将发布。是否有任何通用方法可以通过回调通知调用者错误?
-
我们遵循的约定是在调用回调方法时传递两个参数。
callback(err, result);万一没有报错,就传error = null。callback(err);如果存在错误,则直接传递错误。callback(null, result);