2016-02-13 173 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