我是表达/节点并使用Sequelize作为ORM的新手。
我正在尝试创建一个列表,然后一旦创建了列表,我想更新项目表中的item.isListed布尔值但是我很难得到要调用的事务方法 - 谁能告诉我什么我对这段代码做错了吗?
/ API /上市
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;
答案 0 :(得分:0)
你有没有尝试过它
return models.db.sequelize.transaction(function(...
当你有一连串的承诺时,你需要返回每一个承诺,否则执行将继续而无需等待。了解添加console.log()的位置以及记录的内容会很有帮助。
另一件可能使您的代码更易读和更容易调试的方法是更新项目。由于您有对项目的引用,您可以像这样更新
return item.updateAttributes({isListed: 1}, {transaction: t});
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(t) {...
覆盖原始交易对象。返回的内容实际上是新创建的列表。在编辑问题之前,我无法记住是否存在问题,但这可能是问题的根源。