Я пытаюсь выполнить серию запросов $ .post к базе данных sqlite3 с использованием express.js, но он возвращает unhandled rejection SquelizeTimeoutError: SQLITE_BUSY: database is locked
.
Я понимаю, что это как-то связано с асинхронными запросами к базе данных, но ajax async:false
устарело, а .then
или .done()
, похоже, не ожидают завершения первого сообщения, чтобы выполнить второе, и, следовательно, база данных блокируется при попытке опубликовать ее.
Есть ли способ, в котором я могу выполнить поиск в БД, чтобы увидеть, есть ли другая запись, подобная этой, и, если это не так, добавить нового автора (или авторов) с двумя последовательными почтовыми запросами? Есть ли другой лучший способ уменьшить параллелизм?
Это код, который у меня есть:
$('#add-button').click(function() {
$(".add-status").empty();
var bookUrl = url + "books"; // localhost:3000/api/
// Values from form.
var addTitle = $('#add-book').val();
var addIsbn = $('#add-isbn').val();
var authorList = $('[class^="add-author-"]').map( function (i, data) {
var re = /\w+/; // Checks for string not null.
var authorName = ($(data).val());
if (re.test(authorName)) {
return {name: $(data).val()} ;
}
});
authorList.each( function ( index, data) {
var addAuthor = data.name;
console.log(addAuthor);
var encode = encodeURIComponent(addAuthor);
$.get(url + "search?type=author&name=" + encode).then(res => {
console.log(res.length);
if (res.length < 1) {
$.post(url + "authors/", {name: addAuthor}).then(function(response) {
console.log(response.id);
$.post(url + "authors/" + response.id + "/books", {bookTitle: addTitle, bookISBN: addIsbn}).then( res => {
console.log(res);
});
});
} else {
console.log(res[0]);
$.post(url + "authors/" + res[0].id + "/books", {bookTitle: addTitle, bookISBN: addIsbn}).then( res => {
console.log(res);
});
};
});
$('.add-form').each( function() {
this.reset();
});
$('.add-status').append(
'<h2 class="success"> Entry Successfully added to the database</h2>');
});
});