我正在编写一个分析应用程序,用于收集事件并将其与访问者联系起来。
我的访客猫鼬模型如下:
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);
});
});
通过使用此方法,我触发多个并发请求,我得到重复访问者,而不是一个有多个事件的访问者。
我该如何解决这个问题?什么是最好的方法?
答案 0 :(得分:0)
在mongoose模型中为标识符添加unique index。这样,第二个请求将因唯一索引违规而中断。只要确保你处理那个错误。
如果您在客户端使用单页框架(角度,主干等),请确保在进行api调用时禁用该按钮,并在服务器响应时启用它。