【问题标题】:Duplicate DB submissions with mongoose使用猫鼬重复​​提交数据库
【发布时间】:2013-03-25 04:17:25
【问题描述】:

我是 node.js 的新手,我遇到了一些命令重复的间歇性问题。 我认为这可能与我试图将我的数据库交互与我的其余代码分开并且我没有正确隔离它的事实有关。我有一个名为 transaction.js 的文件,如下所示。

var mongoose = require('mongoose');    
    mongoose.connect('mydb');

    function Transaction(){
        var actions = [];
        this.Add = function(query){
            actions.push(query);
        };
        this.Commit = function(){
            for (var i = 0; i < actions.length; i++) {
                actions[i]();
            }
            actions = [];
        };
    }

    exports.Transaction = Transaction

我与

开始新的交易
var transactionlib = require('../DB/transaction');
var transaction = new transactionlib.Transaction();

并调用交易

exports.PostHome = function(req, res){
    var id = new ObjectId(req.body.objectId);
    transaction.Add(function(){
        models.Story.findOne()
            .where('_id').equals(id)
            .exec(function(err, story){               
                saveOrUpdateStory(err, story, req, res);
            });
    });
    transaction.Commit();
};

应该提到的是,在 saveOrUpdateStory 中发生了更多的数据库调用。

这似乎工作正常,但有时它似乎重复命令(提交将添加两次)。我目前的理论是,这与两个人同时提交两个命令以及他们之间共享的事务列表有关。不过,我不确定这一点,并希望得到一些帮助。对我的代码结构的任何批评也将不胜感激,因为我仍在学习节点的最佳实践。

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    如果有人遇到同样的问题,我想澄清一下问题所在。我有一个 Homecontroller.js,我从未创建过它的新实例,因此所有请求都在访问它的全局实例。结果是,如果两个请求在足够短的时间内触发相同的事务两次。

    事后看来,最好将控制器包装在函数中(谷歌“模块模式”),这样就不会发生这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2015-06-17
      • 2021-11-16
      • 2021-10-07
      • 2020-11-14
      相关资源
      最近更新 更多