如何计算博客文章的唯一浏览量(登录和非登录用户)?

问题描述 投票:0回答:1

我想显示一篇博文被阅读的次数,有点像 Business Insider 的内容。

目标是...

  • 不会随着每次重新加载而增加的查看次数。
  • 每篇博文都存储自己的浏览量
  • 从 MongoDB/Mongoose Schema 字段中获取视图计数并将其显示在 HTML 中。

    var express         = require('express');
    var cookieParser    = require('cookie-parser');
    var mongoose        = require('mongoose');
    var express-session = require('express-session');
    
    //Show Blog Post 
    
    router.get('/blog/:categorySlug/:slug', function (req, res)
      var slug = req.params.slug;
        Blog.findOne({'slug' : slug}).populate('comments').exec(function (err, foundBlog) {
          if (err) {
        console.log(err);
          } else {
         res.render('show', { main: foundBlog, title: foundBlog.title});
        }
      });
    });
    

我知道如果我使用

req.session.views
,它会在所有页面的每次重新加载时增加视图计数。

router.get('/blog/:categorySlug/:slug', function (req, res) { 
  req.session.views = (req.session.views || 0) + 1  
  var slug = req.params.slug;
    Blog.findOne({'slug' : slug}).populate('comments').exec(function (err, foundBlog) {
      if (err) {
        console.log(err);
      } else {
        res.render('show', { main: foundBlog, title: foundBlog.title, pageViewCount: req.session.views});
      }
    });
  });

那么我该怎么做才能分别保存每个博客的查看次数并将该查看次数值存储在数据库中该博客文章的

viewCount
字段中,然后使用
<%= main.viewCount %>

将其呈现在HTML中
    // Blog Schema

      var mainBlogSchema = new mongoose.Schema({
      image: String,
      imageDescription: String,
      priority: {
         type: String,
         default: ""
      },
      title: String,
      content: String,
      author: {
         id: {
         type: mongoose.Schema.Types.ObjectId,
         ref: 'User',
       },
         username: String,
         name: String,
      },
      slug: {
         type: String,
         unique: true,
      },
      status: String,
      viewCount: {
         type: Number,
         default: 0,
      },
      category: String,
      categorySlug: String,
      tags: String,
      updated: {
         type: Boolean,
         default: false
      },
      date: { type: Date, default: Date.now },
      comments: [
        {
          type: mongoose.Schema.Types.ObjectId,
          ref: 'Comment',
        },
       ],
     },{
     timestamps: {
       createdAt: 'createdAt',
       updatedAt: 'updatedAt'
      }
     });
node.js mongodb express mongoose express-session
1个回答
1
投票

一种方法可以是(可能需要改变)

  1. 在 UI 页面加载之前,脚本会检查浏览器中的用户令牌(单独的令牌或一些随机字符串令牌)。
  2. 如果令牌不可用,则发送新令牌请求以及页面 ID。
  3. 如果令牌可用,使用令牌和页面 ID 调用 API。
  4. 确保它在每次页面加载甚至页面转换时都被调用。

后端实现可以像

  1. 页面集合将有 page-id 以及 visits:[] 字段。
  2. 一个 API 创建令牌并将其存储在单独的集合(用户)中并遵循步骤 3.
  3. Another API 将token 和page-id 作为输入,它将首先。检查令牌在我们的集合(用户)中是否可用,如果可用,它将使用
  4. 对页面集合进行 mongo 更新
db.pages.update(
   { _id: page-id },
   { $addToSet: {visits: [ user_token ] } }
)

如果存储的令牌是唯一的,则此查询会小心,无需担心任何事情。如果需要,我们可以维护一个名为 visitCount 的单独字段,一旦执行查询更新至少一条记录,该字段就会更新为最新计数。

优点

  1. 页面刷新不会影响计数
  2. 令牌也由我们维护,因此我们可以进行验证。

缺点

  1. 我们将需要巨大的空间来存储这些令牌,如果用户很长时间没有访问该网站,我们必须删除它们。
  2. API 调用开销。
© www.soinside.com 2019 - 2024. All rights reserved.