Javascript 未调用Sequelize事务处理方法
我不熟悉express/node并使用Sequelize作为ORM 我正在尝试创建一个列表,一旦创建了列表,我想更新item表中的item.isListed boolean,但是我很难调用事务方法-有人能告诉我这段代码有什么问题吗 /api/listingJavascript 未调用Sequelize事务处理方法,javascript,express,web,transactions,sequelize.js,Javascript,Express,Web,Transactions,Sequelize.js,我不熟悉express/node并使用Sequelize作为ORM 我正在尝试创建一个列表,一旦创建了列表,我想更新item表中的item.isListed boolean,但是我很难调用事务方法-有人能告诉我这段代码有什么问题吗 /api/listing var models = require('../../models'); var router = require('express').Router(); router.route('/:id') .post(function
var models = require('../../models');
var router = require('express').Router();
router.route('/:id')
.post(function(req,res){
models.Item.findOne({
where : {
itemID : req.params.id
}
}).then(function(item){
if (item){
if (item.owner != req.decoded.user.username){
res.json({message:"not your item"})
} else {
//This message is displayed in console.
console.log("entering transaction");
return models.db.sequelize.transaction(function(t){
//This message is not displayed in console.
console.log("inside transaction")
return models.Listing.create({
sellerID : req.decoded.user.username,
startDate : req.body.startDate,
endDate : req.body.endDate,
startPrice : req.body.startDate,
reservePrice : req.body.reservePrice,
isSold : 0,
itemID : req.params.id
}, {transaction: t}).then(function(t){
return item.updateAttributes({
isListed : 1
}, {transaction: t});
})
}).then(function(result){
res.json({message:"success"})
}).catch(function(err){
res.json(err);
})
//end of else block
}
//end of if item block
}
}).catch(function(err){
res.json(err);
})
});
module.exports = router;
你试过了吗
return models.db.sequelize.transaction(function(...
当你有一系列的承诺时,你需要回报每一个承诺,否则执行将不需要等待。了解您在何处添加了console.log()以及正在记录的内容会很有帮助
另一件可能使代码更可读、更易于调试的事情是如何更新项。因为您有一个对项目的引用,所以可以这样更新
return item.updateAttributes({isListed: 1}, {transaction: t});
return models.Listing.create({
sellerID:req.decoded.user.username,
起始日期:req.body.startDate,
endDate:req.body.endDate,
startPrice:req.body.startDate,
reservePrice:req.body.reservePrice,
伊索尔德:0,
itemID:req.params.id
},{transaction:t})
.然后(函数(t){
return item.updateAttributes({
名单:1
},{transaction:t});
})
你试过做吗
return models.db.sequelize.transaction(function(...
当你有一系列的承诺时,你需要回报每一个承诺,否则执行将不需要等待。了解您在何处添加了console.log()以及正在记录的内容会很有帮助
另一件可能使代码更可读、更易于调试的事情是如何更新项。因为您有一个对项目的引用,所以可以这样更新
return item.updateAttributes({isListed: 1}, {transaction: t});
return models.Listing.create({
sellerID:req.decoded.user.username,
起始日期:req.body.startDate,
endDate:req.body.endDate,
startPrice:req.body.startDate,
reservePrice:req.body.reservePrice,
伊索尔德:0,
itemID:req.params.id
},{transaction:t})
.然后(函数(t){
return item.updateAttributes({
名单:1
},{transaction:t});
})
“努力获取要调用的事务方法”,那么到底发生了什么?完全没有执行或部分执行?有错误吗?根本没有执行-我在那里添加了一个console.log来尝试查看是否发生了任何事情,但是所有得到的都返回了一个空对象“{}”,正在努力获取要调用的事务方法,那么到底发生了什么呢?完全没有执行或部分执行?有错误吗?根本没有执行-我在那里添加了一个console.log,以尝试查看是否发生了任何事情,但所有返回的都是一个空对象“{}”我添加了您的第一个建议-我仍然只是收到{}作为响应,并且没有对列表或项目表进行任何更改。请尝试返回models.sequelize.transaction(函数(…
我不知道您是如何初始化模型的,但我猜您正在使用建议的样板文件(来自),在这种情况下,sequelize直接是模型的一个属性。我发现一种有用的技术是打开一个节点REPL并要求您的模型加入其中。然后您可以使用制表符完成来确定连接了哪些属性。如果您将sequelize的日志输出管道化到一个文件中,这样您就可以查看正在执行的SQL,这也会很有帮助。我还在回答的末尾添加了一些注释。请查看您是否正在覆盖事务对象,以及这是否导致它失败。我添加了您的第一个建议-我仍然只是收到{}作为响应,并且没有对列表或项目表进行任何更改。请尝试返回模型。sequelize.transaction(函数(…
我不知道您是如何初始化模型的,但我猜您正在使用建议的样板文件(来自),在这种情况下,sequelize直接是模型的一个属性。我发现一种有用的技术是打开一个节点REPL并要求您的模型加入其中。然后您可以使用制表符完成来确定连接了哪些属性。如果您将sequelize的日志输出管道化到一个文件中,这样您就可以查看正在执行的SQL,这也会很有帮助。我还在回答的末尾添加了一些注释。请查看您是否正在覆盖事务对象,以及这是否导致事务对象失败。