Javascript 使用mongoose重复提交数据库

Javascript 使用mongoose重复提交数据库,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我是node.js的新手,有些命令被复制时会出现间歇性问题。 我认为这可能与我试图将我的db交互与我的代码的其余部分分离开来,而我没有正确地将其隔离开来这一事实有关。我有一个名为transaction.js的文件,如下所示 var mongoose = require('mongoose'); mongoose.connect('mydb'); function Transaction(){ var actions = []; this.

我是node.js的新手,有些命令被复制时会出现间歇性问题。 我认为这可能与我试图将我的db交互与我的代码的其余部分分离开来,而我没有正确地将其隔离开来这一事实有关。我有一个名为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
并使用

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();
};
应该提到的是,在SaveOrUpdateStore中有更多的db调用发生


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

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

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

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