Node.js的异步数据库问题

Node.js的异步数据库问题,node.js,asynchronous,callback,asynccallback,database-locking,Node.js,Asynchronous,Callback,Asynccallback,Database Locking,我正在尝试使用sqlite3查询一个在没有express的节点服务器上运行的数据库,以检查数据库中是否有元素。一旦发现此元素是否存在,它将继续使用此信息访问另一个表 var username; checkSessionID(usersSessionID, function(temp) { username = temp[0].username; }); var db = new sql.Database("Pete's FCRs.db"); var ps = db.prepare("se

我正在尝试使用sqlite3查询一个在没有express的节点服务器上运行的数据库,以检查数据库中是否有元素。一旦发现此元素是否存在,它将继续使用此信息访问另一个表

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是否在数据库的sessionID表中。 2) 接下来,它调用回调函数,以存储与会话ID关联的用户名

但是,由于回调是异步的,所以我在更新“username”之前访问数据库

要尝试解决此问题,不可能在回调函数中移动数据库查询,因为这会导致错误,因为数据库已锁定

非常感谢你的帮助

编辑


通过将db声明为全局变量并在所有过程完成后关闭它,设法解决了这个问题

通常,在编写异步代码时,需要将代码移动到回调中,否则它会立即触发:

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();
});
请记住,您的代码是按顺序执行的,而不是一行接一行

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

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

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

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

如果是异步编写的,请确保在启动回调后调用数据库关闭。看起来你马上就要做了。您必须链接回调以强制执行依赖项排序。这很有效,非常感谢!