узел / mssql / async пытается выполнить неизвестное количество запросов последовательно - PullRequest
0 голосов
/ 29 июня 2018

Я использую node.js v10.4.1 с пакетами mssql и async. Я пытаюсь выполнить несколько запросов последовательно с обещаниями, однако наступает момент, когда мне нужно выполнить набор запросов, точное количество которых неизвестно до времени выполнения. Я пытался использовать async.mapSeries для этого. Пожалуйста, смотрите код ниже. Обратите внимание, что запросы заключены в транзакцию, потому что либо все вставки должны быть выполнены успешно, либо все должны завершиться с ошибкой (т.е. откатиться).

const theTransaction = thePool.transaction();
theTransaction.begin(err => {
    if (err) {
        //handle err here
    };
    console.log("Begin write issue transaction...");
    theTransaction.request()
        .input("myInputParameter", sql.NVarChar, myInputParameter)
        .query("insert into ... values ...")
        .then(result => {
                    console.log(result);
                    var theList = getInsertedList(); // returns array of string 
                    async.mapSeries(theList, async (item, next) => {
                       console.log(item);
                       theTransaction.request()
                          .input("parameter", sql.NVarChar, item)
                          .query("insert into ... values ...")
                          .then(next);
                    });
             }) // error handling left out for brevity
       .then(result => {
                   console.log("Committing...");
                   theTransaction.commit(); // error handling left out
                   console.log("Committed.");
             })
       .catch(err => {
                   console.log("Aborting...");
                   theTransaction.rollback(); // error handling left out
                   console.log("Transaction rolled back.");
             });
    });

(Возможно, я допустил синтаксическую ошибку при переносе своего кода в этот комментарий, но мой оригинальный код компилируется и загружается нормально.)

При запуске этого я получаю ошибку:

RequestError: Requests can only be made in the LoggedIn state, not the SentClientRequest state

, что, как я понимаю, означает, что последующие запросы в mapSeries не ожидают завершения предыдущих запросов. Ошибка возникает после первого запроса из списка mapSeries.

Любые мысли о том, как это исправить, приветствуются.

Я подумал, что мне, возможно, придется создать один синтаксический запрос в виде строки из списка и просто выполнить один запрос в .then. Проблема этого подхода заключается в том, что в этом случае мне нужно напрямую включить параметры в строку запроса, а не использовать .input (что не идеально, поскольку открывает возможность для атак с использованием SQL-инъекций).

Спасибо!

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете передавать запросы в виде карты. Тогда это не будет зависеть от количества запросов, которые вы передаете.

const request = new sql.Request();
for (key in inputMap) {
  request.input(key, inputMap[key]);
}
...