使用mongoose复制DB提交

Duplicate DB submissions with mongoose

本文关键字:提交 DB 复制 mongoose 使用      更新时间:2023-09-26

我是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

我用

开始一个新的交易
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中有更多的db调用正在发生。

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

的最佳实践。

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

事后看来,把你的控制器包装在函数中是个好主意(谷歌"模块模式"),这样就不会发生这种情况。