Node.js 7 już obsługuje składnię async/await, w transakcji sequelize jeśli użycie async/await spowoduje, że transakcja nie jest włączona, jak mam jej użyć?Node.js 7 jak korzystać z sequelize transakcji z async/czekaj?
Odpowiedz
let transaction;
try {
// get transaction
transaction = await sequelize.transaction();
// step 1
await Model.destroy({where: {id}, transaction});
// step 2
await Model.create({}, {transaction});
// commit
await transaction.commit();
} catch (err) {
// Rollback transaction if any errors were encountered
await transaction.rollback();
}
Powyższy kod zawiera błąd w wywołaniu niszczenia.
await Model.destroy({where: {id}, transaction});
Transakcja jest częścią obiektu opcji.
poprawiono odpowiedź powyżej - dzięki – pkyeck
Odpowiedź udzielona przez user7403683 opisuje asynchronicznej/czekają na drogę niekontrolowana transakcji (http://docs.sequelizejs.com/manual/tutorial/transactions.html#unmanaged-transaction-then-callback-)
Zarządzane transakcji w async/czekają styl może wyglądać następująco:
await sequelize.transaction(async t=>{
const user = User.create({ name: "Alex", pwd: "2dwe3dcd" }, { transaction: t})
const group = Group.findOne({ name: "Admins", transaction: t})
// etc.
})
W przypadku wystąpienia błędu, transakcja jest automatycznie wycofane.
Przyjęta odpowiedź to "transakcja niezarządzana", która wymaga jawnego połączenia pod numerami commit
i rollback
. Dla każdego, kto chce „Udało transakcji”, to co to będzie wyglądać:
try {
// Result is whatever you returned inside the transaction
let result = await sequelize.transaction(async (transaction) => {
// step 1
await Model.destroy({where: {id}, transaction});
// step 2
return await Model.create({}, {transaction});
});
// In this case, an instance of Model
console.log(result);
} catch (err) {
// Rollback transaction if any errors were encountered
console.log(err);
}
Aby wycofać, po prostu wyrzucić błąd wewnątrz funkcji transakcyjnej:
try {
// Result is whatever you returned inside the transaction
let result = await sequelize.transaction(async (transaction) => {
// step 1
await Model.destroy({where: {id}, transaction});
// Cause rollback
if(false){
throw new Error('Rollback initiated');
}
// step 2
return await Model.create({}, {transaction});
});
// In this case, an instance of Model
console.log(result);
} catch (err) {
// Rollback transaction if any errors were encountered
console.log(err);
}
To nie działa. 't' w tym przypadku jest Obietnicą, a nie obiektem transakcji. – Pier
@Pier, poczekaj na sequelize.transaction(), a następnie uzyskaj wynik. t nie jest obietnicą, jest wynikiem obietnicy. –
Oh masz rację, całkowicie przegapiłem to – Pier