我想知道编码中是否有任何部分我做错了。 我试图做一系列的功能和检查,如果有一些条件没有满足,我想回滚事务。
参考了参考资料在抛出新错误后,我的事务仍然会被提交。
这是我的示例编码。
//db.js
import Sequelize from 'sequelize';
import Cls from 'continuation-local-storage';
Sequelize.cls = Cls.createNamespace('db');
const Conn = new Sequelize(
'relay',
'postgres',
'tec832',
{
dialect: 'postgres',
host: 'localhost'
}
);
module.exports.Db = Conn;
在schema.js中我有
Db.transaction({autocommit: false}).then(()=>{
args = {vcTitle: {$ilike: `Sample title by Nick`}};
return testDelPostPromiseNoTran(args).then(obResult => {
throw new Error("Wrong account type");
})
});
function testDelPostPromiseNoTran(args){
return new Promise((resolve, reject) => {
resolve(delDataNoTran('Post', args));
});
}
//I am trying to do a standard delete
function delDataNoTran(vcTbName, args){
return Db.models[vcTbName].destroy({where: args})
.then(result =>{
if(result > 0){
return true;
}else{
return false;
}
})
.error(obStatus =>{
return false;
});
}
答案 0 :(得分:0)
您的代码存在一些问题:
Db.transaction({autocommit: false}).then(()=>{
args = {vcTitle: {$ilike: `Sample title by Nick`}};
return testDelPostPromiseNoTran(args).then(obResult => {
throw new Error("Wrong account type");
})
});
应该......
Db.transaction(()=>{
args = {vcTitle: {$ilike: `Sample title by Nick`}};
return testDelPostPromiseNoTran(args).then(obResult => {
throw new Error("Wrong account type");
})
});
您应该将功能传递给Db.transaction
。将其放在.then()
块内意味着它在事务之后运行,因此不会包含在事务内。这是你的主要问题。
function testDelPostPromiseNoTran(args){
return new Promise((resolve, reject) => {
resolve(delDataNoTran('Post', args));
});
}
...返回一个永远解决的承诺。这是多余的,因为delDataNoTran
已经返回一个承诺 - 没有理由将它包装在另一个承诺中。
args = {vcTitle: {$ilike: `Sample title by Nick`}};
“ilike”应该是“iLike”(区分大小写。)
我建议花一些时间阅读Sequelize docs。