Асинхронные проблемы с базой данных с Node.js
Я пытаюсь запросить базу данных, работающую на сервере узла без экспресс-использования 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) Затем он вызывает функцию обратного вызова, чтобы сохранить имя пользователя, связанное с идентификатором сеанса.
Однако из-за того, что обратные вызовы являются асинхронными, я обращаюсь к базе данных до того, как будет обновлено "имя пользователя".
Чтобы попытаться решить эту проблему, невозможно переместить запросы к базе данных внутри функции обратного вызова, поскольку это вызывает ошибку, поскольку база данных заблокирована.
Большое спасибо за любую помощь.
редактировать
Решил ее, объявив db глобальной переменной и закрыв ее после завершения всего процесса.
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, помогает значительно упростить этот код и упростить его выполнение. Обещания могут занять некоторое время, чтобы освоить, это новая концепция, но как только вы поймете, как они работают, вещи становятся намного лучше.
Обещательная версия этого кода будет выглядеть примерно так:
ps.all(username)
.then(function(rows) {
console.log(rows);
})
.then(function() {
return ps.finalize();
})
.then(function() {
return db.close();
})
Перехват ошибок выполняется автоматически, и при желании можно добавить специальные обработчики.