【问题标题】:Asynchronous Database Problems with Node.jsNode.js 的异步数据库问题
【发布时间】:2015-06-20 08:13:56
【问题描述】:

我正在尝试查询一个数据库,该数据库在节点服务器上运行而无需使用 sqlite3 表达,以检查数据库中是否存在元素。在发现此元素是否存在后,它将继续使用此信息访问不同的表。

var username;
checkSessionID(usersSessionID, function(temp) {
    username = temp[0].username;
});
var db = new sql.Database("Pete's FCRs.db");
var ps = db.prepare("select * from users where username = ?", errorFunc);
ps.all(username, function(err, rows) {
    if (err) throw err;
    console.log(rows);
});
ps.finalize();
db.close();

function checkSessionID(sessionID, callback) {
var db = new sql.Database("Pete's FCRs.db");
var ps = db.prepare("select * from sessionIDs where sessionID = ?", errorFunc);
ps.all(sessionID, function(err, rows) {
    if (err) throw err;
    callback(rows);
});
ps.finalize();
db.close();
}

("test: " + sessionDetails);

1) 我运行 checkSessionID 来检查 sessionID 是否在数据库中,在 sessionIDs 表中。 2)接下来,它调用回调函数,存储与会话ID关联的用户名。

但是,由于回调是异步的,我在“用户名”更新之前访问数据库。

要尝试解决此问题,无法在回调函数内移动数据库查询,因为这会导致错误,因为数据库已锁定。

非常感谢您的帮助。

编辑

通过将 db 声明为全局变量并在所有进程完成后关闭它来设法解决它。

【问题讨论】:

  • 如果您正在异步编写此代码,请确保您的数据库关闭调用在回调被触发之后。看起来你马上就在这里。你必须链接你的回调来强制依赖排序。
  • 成功了,非常感谢!

标签: node.js asynchronous callback asynccallback database-locking


【解决方案1】:

一般在编写异步代码时需要在回调中移动代码,否则会立即触发:

var db = new sql.Database("Pete's FCRs.db");
var ps = db.prepare("select * from users where username = ?", errorFunc);

ps.all(username, function(err, rows) {
  if (err) throw err;
  console.log(rows);

  ps.finalize();
  db.close();
});

请记住,您的代码是乱序执行的,而不是一行一行地执行。

我发现使用像Bluebird 这样的promise 库有助于大大简化此代码并使其更易于遵循。承诺可能需要一点时间来吸收,它们是一个新概念,但是一旦你知道它们是如何工作的,事情就会变得更好。

此代码的 promise 版本大致如下:

ps.all(username)
  .then(function(rows) {
     console.log(rows);
  })
  .then(function() {
    return ps.finalize();
  })
  .then(function() {
    return db.close();
  })

错误捕获是自动完成的,如果需要,可以添加特殊的处理程序。

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2013-03-25
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 2020-07-21
    • 2015-01-30
    相关资源
    最近更新 更多