Javascript 如何在平均堆栈中实现命中计数器?

Javascript 如何在平均堆栈中实现命中计数器?,javascript,node.js,mongodb,express,mean-stack,Javascript,Node.js,Mongodb,Express,Mean Stack,问题: 如何对用户发表的每一篇文章进行点击计数 对于每个查看页面的唯一访问者,计数应该增加 我知道如何增加计数并将其保存到服务器端,但如何通过IP限制计数并防止操作 附言:我不想用GA(谷歌分析)来做这件事 参考资料: 这提到了使用缓存。有人能解释一下这在javascript中会是什么样子吗 一个选项是为帖子id和用户IP创建文档,以确保访问者的唯一性。这可能是这样的: var hitSchema = mongoose.Schema({ postId: STRING, ip: STRI

问题:

如何对用户发表的每一篇文章进行点击计数

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

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

附言:我不想用GA(谷歌分析)来做这件事


参考资料:

这提到了使用缓存。有人能解释一下这在javascript中会是什么样子吗


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

var hitSchema = mongoose.Schema({
  postId: STRING,
  ip: STRING
});
输入几个条目后,此文档将如下所示:

[{
  postId: 1,
  ip: 192.168.0.1
}, {
  postId: 1,
  ip: 192.168.0.2
}]
现在,当你为一篇文章做一个get请求时,检查该文章的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
对象上添加一个计数器,如果找不到,则增加该计数器


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

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

var hitSchema = mongoose.Schema({
  postId: STRING,
  ip: STRING
});
输入几个条目后,此文档将如下所示:

[{
  postId: 1,
  ip: 192.168.0.1
}, {
  postId: 1,
  ip: 192.168.0.2
}]
现在,当你为一篇文章做一个get请求时,检查该文章的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
对象上添加一个计数器,如果找不到,则增加该计数器


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

这个问题太宽泛了。这不是“如何”教程service@charlietfl你对我的问题的理解与我的不同,但我认为这个问题太宽泛了。这不是“如何”教程service@charlietfl您对我的问题的理解与我的不同,但我尊重^^^我不确定我是否理解:我必须为每个IP命中创建一个由postID和IP组成的文档,以了解它以前是否被命中?这似乎效率很低:/您必须确保访客(IP)对于单个帖子(postId)的访客列表是唯一的。否则每次有人刷新页面时,你都会增加计数器。你的推理绝对正确,但我只是想知道是否有更简单的答案?例如,这里讨论的是什么?但是我不确定:/image您想显示一个按其视图排序的帖子列表。为此,您需要对计数值进行“反规范化”,这样您就不必通过在
Post
上添加计数器来一直查找所有帖子。但为了确保柜台记录下独特的访客。您需要了解以前的访问者,这就是hit文档的用途。感谢您的分析和回答:我不确定我是否理解:我必须为每个IP命中创建一个包含postID和IP的文档,才能知道它以前是否被命中?这似乎效率很低:/您必须确保访客(IP)对于单个帖子(postId)的访客列表是唯一的。否则每次有人刷新页面时,你都会增加计数器。你的推理绝对正确,但我只是想知道是否有更简单的答案?例如,这里讨论的是什么?但是我不确定:/image您想显示一个按其视图排序的帖子列表。为此,您需要对计数值进行“反规范化”,这样您就不必通过在
Post
上添加计数器来一直查找所有帖子。但为了确保柜台记录下独特的访客。您需要了解以前的访客,这就是hit文档的目的。感谢您的分析和回答:D