запрос express.js $ .post () внутри цикла .each блокирует базу данных? - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь выполнить серию запросов $ .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>');

    });
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...