【问题标题】:How to implement a hit counter in MEAN stack?如何在 MEAN 堆栈中实现命中计数器?
【发布时间】:2017-02-08 20:44:31
【问题描述】:

问题:

如何对用户发布的每个帖子进行点击计数?

查看该页面的每个唯一访问者的计数应增加。

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

P.S.:我不希望为此使用 GA(Google Analytics)。


参考:

这提到了使用缓存。有人可以解释一下这在 javascript 中的外观吗?

Page View Counter like on StackOverFlow

【问题讨论】:

  • 问题太宽泛了。这不是“如何”教程服务
  • @charlietfl 您对我的问题的理解与我的不同,但我尊重这一点^^
  • 我真的很感激这个问题,不像这个地方毫无疑问地充满了自我用户

标签: javascript node.js mongodb express mean-stack


【解决方案1】:

一种选择是为帖子的 id 和用户的 IP 创建一个文档,以确保唯一的访问者。这可能如下所示:

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

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

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

现在,当您对帖子进行获取请求时,请检查是否已记录该帖子的 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 对象上添加一个计数器,如果未找到,则将其递增。

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

【讨论】:

  • 我不确定我是否理解:我必须为每个 IP 命中创建一个包含 postID 和 IP 的文档,以了解它之前是否被命中?这似乎非常低效:/
  • 您必须确保访问者 (IP) 在单个帖子 (postId) 的访问者列表中是唯一的。否则每次有人刷新页面时你都会增加计数器。
  • 您的推理绝对合理,但我只是想知道是否没有更简单的答案?例如这里讨论的是什么? stackoverflow.com/questions/246919/… 我不确定:/
  • 我认为 Windows 服务器和 IIS 的工作方式超出了 express/node 的范围。如果服务器停止,存储在内存中的所有数据都会丢失,并且您可能会遇到内存不足异常。如果您想要的只是内存中的命中计数器,则可以将其存储在对象中。 var visited = { 'postId': 'counter', 'postId': 'counter'}
  • 感谢您的分析和回答:D
猜你喜欢
  • 1970-01-01
  • 2017-07-04
  • 2015-03-17
  • 1970-01-01
  • 2020-04-11
  • 2016-01-06
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
相关资源
最近更新 更多