如何在 MEAN 堆栈中实现命中计数器?

How to implement a hit counter in MEAN stack?

问题:

我如何对用户的每个 post 进行点击计数?

每个查看该页面的独立访问者的计数都应该增加。

我知道如何增加计数并将其保存在服务器端,但如何通过 IP 限制它并防止操纵?

P.S.: 我不想为此使用 GA(Google 分析)。


参考:

这提到使用缓存。有人可以解释一下 javascript 中的样子吗?

Page View Counter like on Whosebug

一个选项是为post的id和用户的IP创建一个文档,以确保访问者的唯一性。这可能看起来像这样:

var hitSchema = mongoose.Schema({
  postId: STRING,
  ip: STRING
});

输入几个条目后,该文档将如下所示:

[{
  postId: 1,
  ip: 192.168.0.1
}, {
  postId: 1,
  ip: 192.168.0.2
}]

现在,当您对 post 执行获取请求时,检查是否已记录 post 的 IP,如果没有则添加它。

app.get('/api/posts/:id', function(req, res) {
  var postId = req.params.id;
  var ip = req.connection.remoteAddress;

  Hit.find({postId: postId, ip: ip}).then(function(result) {
    //var newVisitor = false;
    if (!result) { /* add a new record and newVisitor = true */

    return Post.find({id: postId}).then(function(post) {
      //if (newVisitor) { /* update the counter on the post */
      res.send(post);
    });
  });
});

现在,我们现在所完成的是对所有访客的独特价值。然后,您可以查询文档并获取访问过的 IP 列表以获取计数,或者使用新 IP 在 Post 对象上添加一个计数器,如果找不到则递增它。

当您需要提高算法效率时,最后一个选项是正常的。