使用nodejs确保数据完整性,解决问题并使用mongoose

时间:2016-02-24 15:00:32

标签: javascript node.js mongodb mongoose restify

我正在编写一个分析应用程序,用于收集事件并将其与访问者联系起来。

我的访客猫鼬模型如下:

var visitorSchema = new Schema({ 
    created_at: { type: Date, default: Date.now }, 
    identifier: Number,
    client_id: Number,
    account_id: Number,
    funnels: [String],
    goals: [Goal],
    events: [Event]
});

api接受混合的访客信息和事件

{
  "identifier": 11999762224,
  "client_id": 1,
  "account_id": 1,
  "event": {
      "context": "Home",
      "action": "Click red button",
      "value": ""
  }
}

当restify收到请求时,它会检查访问者是否存在,如果存在,则只需按如下方式推送事件:

server.post('/event', function (req, res, next) {
    Visitor.findOne({ 
        identifier: req.params.identifier, 
        client_id: req.params.client_id,
        account_id: req.params.client_id
    }, function(err, visitor) {
        if(err) {
                             console.log(err);
            res.send(500, visitor);
        }

        if(visitor) {
            visitor.events.push(req.params.event);
            visitor.save();
        } else {
            visitor = new Visitor({
                identifier: req.params.cpf, 
                client_id: req.params.client_id,
                account_id: req.params.client_id,
                funnels: req.params.funnels,
                events: req.params.event
            });
            visitor.save();
        }

        res.send(200, visitor);
    });
});

通过使用此方法,我触发多个并发请求,我得到重复访问者,而不是一个有多个事件的访问者。

我该如何解决这个问题?什么是最好的方法?

1 个答案:

答案 0 :(得分:0)

在mongoose模型中为标识符添加unique index。这样,第二个请求将因唯一索引违规而中断。只要确保你处理那个错误。

如果您在客户端使用单页框架(角度,主干等),请确保在进行api调用时禁用该按钮,并在服务器响应时启用它。