我是新来表达/结点并使用Sequelize作为ORM。

我正在尝试创建清单,然后创建清单后,我想更新item表中的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;

最佳答案

您是否尝试过

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) {...,它将覆盖原始事务对象。返回的实际上是新创建的清单。我不记得在编辑问题之前是否在那里,但这可能是问题的根源。

09-04 14:52