Node.js的异步数据库问题
我正在尝试使用sqlite3查询一个在没有express的节点服务器上运行的数据库,以检查数据库中是否有元素。一旦发现此元素是否存在,它将继续使用此信息访问另一个表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
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();
})
错误捕获是自动完成的,如果需要,可以添加特殊的处理程序。如果是异步编写的,请确保在启动回调后调用数据库关闭。看起来你马上就要做了。您必须链接回调以强制执行依赖项排序。这很有效,非常感谢!