节点js和mongo db bug

时间:2017-03-09 10:01:18

标签: javascript node.js mongodb

我有一个模拟交易所的程序,似乎运作良好,特别是当我设置一个止损或获利时。但是,当有多次出现时,它只执行一次。我似乎无法弄明白。这也适用于我称之为短期兴趣的抽象。当我保存时,Mongo似乎创建了两个实例,这有点问题。我知道代码现在已经过了,但我打算让它工作然后开始优化。以下是执行上述抽象的代码:

    tradeIdIndex = results.history[results.history.length - 1]._id;
        if(req.body.typeofTrade == 'short'){
            results.shortInterest.push({
                time : Date(),
                price : req.body.price,
                tradeId : tradeIdIndex,
                typeofTrade : req.body.typeofTrade,
                quantity : req.body.quantity,
                userId : req.body.userId
            })
            results.save();
        }

如果满足某些条件,这将保存我希望稍后删除的shortInterest。如果满足删除shortInterest,takeProfit和stopLosses的条件,则调用下面的代码,这实际上只是函数的一个片段。它按照我的预期执行。

if(tradeId){
        console.log("I am checking the sell and cover to remove the respective open trades");
        for(var i = userData.openTrades.length -1; i >= 0; i--){
            if(userData.openTrades[i].celebrity == self.req.celebrityName && userData.openTrades[i].typeofTrade == typeofTrade && userData.openTrades[i].tradeId == tradeId){
                console.log(userData.openTrades[i]);
                userData.openTrades.splice(i, 1);

                userData.save();
            }
        };
        }

它将控制权返回给下面的代码,该代码实际上将其称为继续执行。

case "short" :
        checkSellandCover(userData, 'short', self, req.tradeId);
        removeStops(self.celebrity, userId, 'cover', req.tradeId);
        removeTakeProfits(self.celebrity, userId, 'cover', req.tradeId);
        removeShortInterest(self.celebrity, userId, 'short', req.tradeId);
        userData.save();

        if(self.celebrity.ask > req.shortPrice){
           value = parseFloat(self.celebrity.ask) * parseFloat(req.quantity) - parseFloat(req.shortPrice) * parseFloat(req.quantity);

           userData.accountValue = parseFloat(userData.accountValue) - value + parseFloat(req.shortPrice) * parseFloat(req.quantity);
           userData.save();
          } else {
                  value = 2 * parseFloat(req.shortPrice) * parseFloat(req.quantity) - parseFloat(self.celebrity.ask) * parseFloat(req.quantity);
                  userData.accountValue = userData.accountValue + value;
                  userData.save();
          }
          break;

如上所述,我的问题和疑问是:

1)为什么mongo会保存我的数据两次。 2)如果我有多个止损或获利,则上述代码不能正确执行。与短期兴趣相同,因为它被保存两次。既然我已经提出了这个问题,我开始认为这是因为我正在执行数据库操作,并且在执行results.save()指令时,数据库搜索可能仍在执行。

0 个答案:

没有答案