如何validationSequelize交易,并使其看起来不错

经过几年的努力,我正在努力学习NodeJS,所以我正在build设一个小型银行网站作为testing。 我决定为我的ORM使用Sequelize,但是我喜欢用一种方式在人们之间传送金钱。 这是我第一次尝试:

// myUsername - who to take the money from // sendUsername - who to send the money to // money - amount of money to be sent from `myUsername`->`sendUsername` // Transaction is created to keep a log of banking transactions for record-keeping. module.exports = (myUsername, sendUsername, money, done) => { // Create transaction so that errors will roll back connection.transaction(t => { return Promise.all([ User.increment('balance', { by: money, where: { username: myUsername }, transaction: t }), User.increment('balance', { by: -money, where: { username: sendUsername }, transaction: t }), Transaction.create({ fromUser: myUsername, toUser: sendUsername, value: money }, { transaction: t }) ]); }).then(result => { return done(null); }).catch(err => { return done(err); }); }; 

这工作,但它没有validation模型,当它增加。 我希望事务在模型不validation时失败。 我的下一个尝试是去callback,这里显示(相同的函数标题):

 connection.transaction(t => { // Find the user to take money from return User .findOne({ where: { username: myUsername } }, { transaction: t }) .then(myUser => { // Decrement money return myUser .decrement('balance', { by: money, transaction: t }) .then(myUser => { // Reload model to validate data return myUser.reload(myUser => { // Validate modified model return myUser.validate(() => { // Find user to give money to return User .findOne({ where: { username: sendUsername } }, { transaction: t }) .then(sendUser => { // Increment balance return sendUser .increment('balance', { by: money, transaction: t }) .then(sendUser => { // Reload model return sendUser.reload(sendUser => { // Validate model return sendUser.validate(() => { // Create a transaction for record-keeping return Transaction .create({ fromUser: myUser.id, toUser: sendUser.id, value: money }, { transaction: t }); }); }); }); }); }); }); }); }); }).then(result => { return done(null); }).catch(err => { return done(err); }); 

这是有效的,因为钱仍然在人们之间转移,但它仍然没有validation模型。 我认为原因是.reload() .validate().reload()方法没有能力添加transaction: t参数。 我的问题是,如果有一种方法可以在事务中进行validation,但是我还想要一些帮助修复这个“callback地狱”。 再一次,我还没有做JS,所以现在可能有更好的方法,现在我刚刚意识到了。

谢谢!

我相信你不能得到validationModelincrementdecrement ,需要有实例。 在一些sequelize Model方法中,你可以configurationvalidation来运行,但在这里看起来不像

我会这样做

 module.exports = async function(myUserId, sendUserId, money) { const transaction = await connection.transaction(); try { const [myUser, sendUser] = await Promise.all([ User.findById(myUserId, { transaction }), User.findById(sendUserId, { transaction }) ]); await Promise.all([ myUser.increment('balance', { by: money, transaction }), myUser.increment('balance', { by: -money, transaction }) ]); await Transaction.create({...}, { transaction }) await transaction.commit(); } catch(e) { await transaction.rollback(); throw e; } }