#sql #node.js #sql-server #stored-procedures #transactions
Вопрос:
Я реализовал хранимую процедуру в Microsoft SQL Server. И я пытаюсь выполнить эту процедуру в транзакции в API с использованием mssql.
Когда я выполняю свою процедуру в одиночку (вне транзакции в моем API), все работает нормально, но когда я помещаю ее в транзакцию, у меня возникает эта ошибка :
RequestError: Запросы могут быть сделаны только в состоянии LoggedIn, а не в состоянии SentClientRequest
Это мой код :
app.post('/api/...', async function (req, res, next) {
// Pool
const pool = new sql.ConnectionPool(databaseConfiguration);
await pool.connect();
const transaction = await new sql.Transaction(pool);
// Transaction Begin
transaction.begin(async (err) => {
try {
// Error checks
if (err) throw new Error(err);
// No error keep going
// Create request
const request = new sql.Request(transaction);
// Input
request.input('user', sql.VarChar, req.body.user);
request.output('id', sql.Int);
// Execute Procedure
await request.execute('myProcedure', (error, result) => {
// ... error checks
if (error) throw new Error(error);
// No error keep going
console.dir(result);
});
// await fs.rmdirSync(dir, { recursive: true });
transaction.commit((tErr) => tErr amp;amp; next('transaction commit error'));
} catch (error) {
transaction.rollback((tErr) => tErr amp;amp; next('transaction rollback error'));
next(`unknown error inside transaction : ${error}`);
}
});
});
Кто — нибудь имеет хоть какое-то представление о моей ошибке ?
Заранее спасибо за любую помощь.
Комментарии:
1. В какой строке возникает ошибка? Добавьте
console.error(error)
в свой блок catch, чтобы вы могли видеть, где возникает ошибка.2. Здравствуйте, я добавил console.log(ошибка), и ошибка
Error: RequestError: Requests can only be made in the LoggedIn state, not the SentClientRequest state
возникает в строкеif (error) throw new Error(error);
внутри моего запроса.execute(). Однако эта ошибка не возникает, когда функция request.execute() выходит за рамки моей транзакции. Заранее спасибо за любую помощь3. Удалите обратный вызов из .execute и
await
вместо этого4. Вы были правы, большое вам спасибо за помощь ! Поэтому решение состояло в том, чтобы написать
await request.execute('myProcedure')