NodeJS中的访问计数器

时间:2018-12-21 22:39:07

标签: javascript node.js express

我在NodeJS中有我的应用程序。我有n个带有图片的子页面。我想显示某人访问过指定图像的次数。

我的方法很简单。基本上,每个/get我都会在数据库中增加一个字段(像伪代码一样对其进行处理):

app.get('/image/:id', (req, res) => {
   db.find((elem) => elem.id === req.id).update((elem) => elem.counter++);
})

有效。但是,问题在于唯一性。如果我输入该路线并按reload十次,则计数器将增加10。这毫无意义。

问题:如何检查指定用户是否已经在该站点上,所以计数器不会增加?

app.get('/image/:id', (req, res) => {
   if (user is first time on site) {
      db.find((elem) => elem.id === req.id).update((elem) => elem.counter++);
   }
})

有一些nodejs库,例如express-limiter,它们以某种方式存储IP,因此它们不会让某人在指定的时间段内发送相同的请求。我应该这样做并存储IP吗?有没有更简单的方法可以做到这一点?谢谢

2 个答案:

答案 0 :(得分:2)

没有完全安全的方法来执行此操作。您可以:

  1. 存储IP地址,但可以合并来自任何IP,例如机构或企业网络的访问。
  2. 管理sessions。检查每个请求的cookie,并为您以前从未见过的用户创建会话。这里的问题是,当用户清除其cookie时,您将失去识别下一个请求的能力。

无论使用哪种策略,都需要将该信息存储在持久的位置(例如数据库)中,以便可以获取信息并显示或增加它。

答案 1 :(得分:2)

唯一用户是一个很难解决的问题。 与您的想法相反,即使是大公司(除非他们拥有浏览器)也没有对此100%进行排序,因为不可能完全用当今的技术来解决它。

您应该阅读以下内容:

对于不需要登录的网站,这是通过一堆参数完成的,通常是这些参数的组合。

  • IP地址:您可能要使用的最主要的功能之一(也如上所述)可能会解决多个用户的问题。也可以改变。
  • Cookies:标记会话。但是,可以禁用/清除Cookie。
  • 浏览器详细信息:类似于用户代理/操作系统/构建版本/如果您有/其他插件等...

所有这些组合在一起并以您可以对用户进行假设的方式存储(例如,如果删除cookie的话),就可以得到非常准确的结果,但是所有这些参数都可以整夜更改,您无法真正确定地将该用户检测为已访问过用户。实际上,您需要使用machine_id + local_user_id之类的工具才能执行此操作。正如我所说,浏览器可以做到这一点,但这会在隐私方面引起很多问题,因此我怀疑有人会采用这种方式。

在Google / Apple的情况下,我想如果某个用户正在通过各自的浏览器使用他们的服务,考虑到他们来自浏览器+网站的遥测,他们甚至可以对未认证的用户进行进一步的映射,但这可能是最远的。

永远不要以为用户可以接受此操作。最好通过UI与用户进行检查-cookie同意/用户信息存储是一个非常严肃的主题,您可能会遇到很多麻烦如果您设计不正确的方法。