Я использую 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-инъекций).
Спасибо!