2016-02-13 56 views
1

我是新来表达/节点和使用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

“努力获得要调用的交易方法”,那么究竟发生了什么?根本没有执行或部分执行?任何错误? – leroydev

+0

根本没有执行 - 我在那里添加了一个console.log来尝试查看是否有任何事情发生,但所有返回的都是空对象'{}' –

回答

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) {...被覆盖原始的交易对象。返回的内容实际上是新创建的列表。我不记得在你编辑你的问题之前是否有这个问题,但它可能是问题的根源。

+0

我已经添加了您的第一个建议 - 我仍然只是收到{}作为回应并且不对列表或项目表进行修改。 –

+0

尝试'返回models.sequelize.transaction(函数(...'我不知道你是如何初始化'模型',但我猜你正在使用建议的样板(来自[这里](http:// docs。 sequelizejs.com/en/1.7.0/articles/express/)),在这种情况下,sequelize直接是模型的一个属性,我发现一个有用的技术是打开一个节点REPL并且需要你的模型。使用Tab完成来确定连接的属性 如果您将来自sequelize的日志输出传送到文件中,以便您可以查看正在执行的SQL,那么也会有帮助 – aray12

+0

我在答案的末尾还添加了一些注释。看看是否覆盖事务对象,以及是否导致它失败。 – aray12