【问题标题】:Sequelize transaction method not being called未调用 Sequelize 事务方法
【发布时间】:2016-02-13 22:30:05
【问题描述】:

我是 express/node 的新手,并使用 Sequelize 作为 ORM。

我正在尝试创建一个列表,然后在创建列表后我想更新 item 表中的 item.isListed 布尔值,但是我正在努力获取要调用的事务方法 - 谁能告诉我什么这段代码我做错了吗?

/api/listing

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;

【问题讨论】:

  • “努力获取要调用的事务方法”,那么究竟发生了什么?完全不执行或部分执行?有什么错误吗?
  • 根本不执行 - 我在其中添加了一个 console.log 以尝试查看是否发生任何事情,但所有返回的都是一个空对象“{}”

标签: javascript express web transactions sequelize.js


【解决方案1】:

你试过了吗

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});
})

在这个 sn-p 中,您有 then(function(t) {...,它正在覆盖原始事务对象。返回的实际上是新创建的列表。我不记得在您编辑问题之前是否存在,但它可能是问题的根源。

【讨论】:

  • 我已经添加了您的第一个建议 - 我仍然只是收到 {} 作为回复,并且没有更改列表或项目表。
  • 尝试return models.sequelize.transaction(function(... 我不知道你是如何初始化models 但我猜你正在使用建议的样板(来自here),在这种情况下,sequelize 直接是楷模。我发现一种有用的技术是打开一个节点 REPL 并要求你的模型进入其中。然后您可以使用制表符完成来确定连接了哪些属性。如果您将 sequelize 的日志输出通过管道传输到文件中,这样您就可以查看正在执行的 SQL,这也会很有帮助。
  • 我还在答案末尾添加了一些 cmets。看看你是否覆盖了事务对象,以及这是否导致它失败。
猜你喜欢
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2013-05-05
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
相关资源
最近更新 更多