解决使用LeanCloud国际版时网站文章浏览次数不显示的bug

LeanCloud保姆级配置教程 前言 之前写了一篇LeanCloud+Yilia的文章???? https://blog.lete114.top/article/addee0b6.html 我觉得还不够详细,而且之前写的没有Qmsg酱(QQ评论提醒)、Server酱(微信评论提醒) 特此写了这篇更详细的,堪称保姆级别的教程了 废话不多说教程开始 创建LeanCloud应用 注册我就不多说了,有手有脑都会 注意:一定要选择国际版,如果你选择的是华北或者华东的话,Valine后台评论管理是需要备案才能绑定的 打开LeanCloud 官网: 阅读详情

***By Long Luo***

之前[个人网站](www.longluo.me)文章阅读次数存储一直在[Leancloud](http://www.leancloud.cn)上,由于去年国内版要求网站必须备案才能使用之后,个人网站的浏览次数一直是不可用状态。几个月前切换到国际版,但是切换之后浏览次数一直是`空白null`值,正常应该是`0`,数据也不会更新。

后台查看`Counter`数据,也一直是没有数据的状态。当时花费了时间去检查,试图找到问题所在,当时还是怀疑LeanCloud国际版后台接口API的问题,但一直没能解决这个问题。

今天下午从原理入手,分析每个可能的步骤,找到了**问题原因**,在此记录下解决问题的过程。

<!--more-->

# 如何显示阅读次数?
网站使用的是Hexo + Next主题,可以使用3种方式显示阅读次数:1. Leancloud; 2. FireStore; 3. Busuanzi

*FireStore*由于需要使用外网,国内支持不够,尝试过发现不可行;

*Busuanzi*虽然也可以,设置之后发现首页数据显示紊乱,而且不准,使用了一段时间之后放弃;

*LeanCloud*是最合适的,数据也可以很方便的进行迁移。

在Next主题配置`_config.yml`文件中,可以设置使用哪种计数方式。注意文章阅读次数只能设置一个为true,否则页面会显示多个阅读次数。

```yaml
leancloud_visitors:
  enable: true
  app_id: # <your app id> hdPFnwkCdbHRj5Q3OQk5vNJQ-gzGzoHsz
  app_key: # <your app key> p2mNUdDbqxrxOYMjs1xiS0zM 

# Another tool to show number of visitors to each article.
# Visit https://console.firebase.google.com/u/0/ to get apiKey and projectId.
# Visit https://firebase.google.com/docs/firestore/ to get more information about firestore.
firestore:
  enable: false
  collection: articles # Required, a string collection name to access firestore database
  apiKey:  # Required
  projectId:  # Required 

# Show Views / Visitors of the website / page with busuanzi.
# For more information: http://ibruce.info/2015/04/04/busuanzi/
busuanzi_count:
  enable: true
  total_visitors: true
  total_visitors_icon: fa fa-user
  total_views: true
  total_views_icon: fa fa-eye
  post_views: false
  post_views_icon: fa fa-eye
```

## 如何读写阅读次数的?

这里以LeanCloud为例来说明阅读次数是如何读写的。首先打开[网站首页](www.longluo.me),查看源代码:

```html
<span class="post-meta-item-icon">
    <i class="far fa-eye"></i>
</span>
<span class="post-meta-item-text">阅读次数:</span>
<span class="leancloud-visitors-count"></span>
```

可以看出,阅读次数是通过`leancloud-visitors-count`这个`class`的值来显示的,搜索`leancloud-visitors-count`可以在网页的`js`代码中找到:

```javascript
    function leancloudSelector(url) {
      url = encodeURI(url);
      return document.getElementById(url).querySelector('.leancloud-visitors-count');
    }
```

那么这段`js`代码在哪里呢?

通过查找,leancloud的`js`代码在`themes\next\layout\_third-party\statistics`目录下的`lean-analytics.njk`文件,代码如下:

```javascript
{%- if theme.leancloud_visitors.enable %}
<script{{ pjax }}>
  (function() {
    function leancloudSelector(url) {
      url = encodeURI(url);
      return document.getElementById(url).querySelector('.leancloud-visitors-count');
    }

    function addCount(Counter) {
      const visitors = document.querySelector('.leancloud_visitors');
      const url = decodeURI(visitors.id);
      const title = visitors.dataset.flagTitle;

      Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify({ url })))
        .then(response => response.json())
        .then(({ results }) => {
          if (results.length > 0) {
            const counter = results[0];
            leancloudSelector(url).innerText = counter.time + 1;
            Counter('put', '/classes/Counter/' + counter.objectId, { time: { '__op': 'Increment', 'amount': 1 } })
              .catch(error => {
                console.error('Failed to save visitor count', error);
              });
          } else {
            {%- if theme.leancloud_visitors.security %}
              leancloudSelector(url).innerText = 'Counter not initialized! More info at console err msg.';
              console.error('ATTENTION! LeanCloud counter has security bug, see how to solve it here: https://github.com/theme-next/hexo-leancloud-counter-security. \n However, you can still use LeanCloud without security, by setting `security` option to `false`.');
            {% else %}
              Counter('post', '/classes/Counter', { title, url, time: 1 })
                .then(response => response.json())
                .then(() => {
                  leancloudSelector(url).innerText = 1;
                })
                .catch(error => {
                  console.error('Failed to create', error);
                });
            {%- endif %}
          }
        })
        .catch(error => {
          console.error('LeanCloud Counter Error', error);
        });
    }

    function showTime(Counter) {
      const visitors = document.querySelectorAll('.leancloud_visitors');
      const entries = [...visitors].map(element => {
        return decodeURI(element.id);
      });

      Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify({ url: { '$in': entries } })))
        .then(response => response.json())
        .then(({ results }) => {
          for (let url of entries) {
            const target = results.find(item => item.url === url);
            leancloudSelector(url).innerText = target ? target.time : 0;
          }
        })
        .catch(error => {
          console.error('LeanCloud Counter Error', error);
        });
    }

    const { app_id, app_key, server_url } = {{ theme.leancloud_visitors | safedump }};
    function fetchData(api_server) {
      const Counter = (method, url, data) => {
        return fetch(`${api_server}/1.1${url}`, {
          method,
          headers: {
            'X-LC-Id'     : app_id,
            'X-LC-Key'    : app_key,
            'Content-Type': 'application/json',
          },
          body: JSON.stringify(data)
        });
      };
      if (CONFIG.page.isPost) {
        addCount(Counter);
      } else if (document.querySelectorAll('.post-title-link').length >= 1) {
        showTime(Counter);
      }
    }

    const api_server = app_id.slice(-9) === '-MdYXbMMI' ? `https://${app_id.slice(0, 8).toLowerCase()}.api.lncldglobal.com` : server_url;

    if (api_server) {
      fetchData(api_server);
    } else {
      fetch('https://app-router.leancloud.cn/2/route?appId=' + app_id)
        .then(response => response.json())
        .then(({ api_server }) => {
          fetchData('https://' + api_server);
        });
    }
  })();
</script>

{%- endif %}
```

这段代码主要包含以下几个函数:

1. `addCount`:进入文章页面,请求数据库,显示及写入数据库;
2. `showTime`:不进入具体文章页面,请求数据库,显示阅读次数;
3. `fetchData`:从Leancloud数据库获取数据;

函数调用顺序:

> `fetchData` --> `addCount` / `showTime`

# 问题原因出在哪?

显示原理弄明白了,那么为什么数据没有显示呢?

那我们就Debug这个页面吧,打断点,看看`js`代码每一步执行,执行过程和变量数据是否和我们预期一致。

在首页界面调试时,`showTime`会直接进入:

```javascript
        .catch(error => {
          console.error('LeanCloud Counter Error', error);
        });
```

所以数据就显示为`null`了,也不显示0。

在具体文章页面进行Debug:

```javascript
      if (CONFIG.page.isPost) {
        if (CONFIG.hostname !== location.hostname) return;
        addCount(Counter);
      } else if (document.querySelectorAll('.post-title-link').length >= 1) {
        showTime(Counter);
      }
```

进入`fetchData`之后, `if (CONFIG.hostname !== location.hostname) return;`,没有进入`addCount`流程,因此数据为null。

而`if (CONFIG.hostname !== location.hostname) return;`这行代码的目的是:

因为页面也可以在本地上运行,所以这行代码是将在本地`localhost`的刷新次数不视为一个刷新次数,所以就直接`return`了。

Bingo,***问题根源找到了!!!***


# 问题是如何解决的?

解决方法也很简单,去除`if (CONFIG.hostname !== location.hostname) return;`这行代码。

重新编译发布,Okay,阅读次数有了,后台查看数据也存在,问题解决。

# 小结

通过解决这个问题,当出现问题时,要先***理清楚逻辑***,然后一步一步跟踪解决,定位问题,最终解决问题。

原文连接:解决使用LeanCloud国际版时网站文章浏览次数不显示的bug


 

hexo(butterfly)添加说说页面(Artitalk可在线发布) 文章目录一、前言二、我设置的记录参考1.申请leancloud国际版账号2.后台配置3.博客配置三、使用方法1. 输入内容2.输入密码3.发布说说、心情4.功能畅想四、更多 一、前言 之前有写一篇文章是如何在个人网站配置手写说说页面,这是我从drew叔 那搬运过来的,大家一直催问可不可以在线发布,终于drew叔动手了。 我看着他从leadcloud后台鼓捣到gtalk后台,再到leadcloud国... 阅读详情

相关推荐

新手入门机器学习案例(附源代码)

无

guguo666的博客 6655

Hexo-Next 5.1.4目前已知bug及其处理办法

Hexo-Next 5.1.4目前已知bug及其处理办法 1.边栏头像下面日志链接错误 在\themes\next\layout\_macro\sidebar.swig中, 原代码49行: <a href="{{ url_for(theme.menu.archives).split('||')[0] | trim }}"> 修改为: <a href="{{ url_for(co...

shuiyunxc的博客 1264

【强化学习】11 —— Double DQN算法与Dueling DQN算法

可以看到由于数据点的分布,使得拟合出的价值函数无法与真实的价值函数吻合,甚至在部分区域产生了明显的偏差。Dueling DQN 是 DQN 另一种的改进算法,它在传统 DQN 的基础上只进行了微小的改动,但却能大幅提升 DQN 的表现。这样,即使其中一套神经网络的某个动作存在比较严重的过高估计问题,由于另一套神经网络的存在,这个动作最终使用的值不会存在很大的过高估计问题。.在同一个状态下,所有动作的优势值之和为 0,因为所有动作的动作价值的期望就是这个状态的状态价值。环境的状态包括倒立摆角度的正弦值。

sinat_52032317的博客 1万+

LeanCloud国际版遇到的问题及解决方案

LeanCloud国际版遇到的问题及解决方案 个人博客:LeanCloud国际版遇到的问题及解决方案 首先,为什么要用LeanCloud国际版呢?就是因为设置邮件提醒功能时,需要绑定访问域名来唤醒leancloud,而国际版提供免费域名,国内的需要备案域名。 只能说弄这个博客,真的是非常能感受到迭代的快(虽然遇到的不是技术点上的): 搭建博客时,刚好遇上github默认分支从master变为master,然后网上的教程都还是master 这次的问题也是因为us.avoscloud.com这个域名被弃用了

赤蓝紫の博客 1819

国产射频直采收发器CX8242KA JESD204C调试

杭州诚芯公司的CX8242KA是国内开发的极少数支持JESD204C接口的高速AD、DA,Serdes具备支持接收和发送,并且速率可以到25Gbps,在国内属于领先水平。250M参考时钟输入,AD采样率2.5G,DA采样率10G,3收2发,主通道模式4,反馈通道模式1,基带采样率1250M,线速率20.625G,收发同时配置混频625M。CX8242KA的204C接口模式支持10种模式,在手册上都有说明。2、 支持TX信道编码,RX信道解码,提升健壮性。这里使用模式4,支持双通道模式,并且反馈开启。

RFSOC的博客 6218

Field-Oriented Control (FOC) 矢量控制 磁场定向控制

Field-Oriented Control (FOC) 磁场定向控制(FOC),也称为矢量控制,是一种用于控制永磁同步电动机(PMSM)和交流感应电动机(ACIM)的技术。 FOC在整个扭矩和速度范围内都具有良好的控制能力。 FOC的实现需要将定子电流从固定参考系转换为转子磁通参考系(也称为d-q参考系)。 速度控制和转矩控制是FOC最常用的控制模式。位置控制模式不太常见。大多数牵引应用使用转矩控制模式,在该模式下,电动机控制系统遵循参考转矩值。在速度控制模式下,电机控制器遵循参考速度值,并生成用于形成内

>>> 1万+

【解决】使用LeanCloud配置Next主题文章浏览量显示不正常的问题

解决使用LeanCloud配置Next主题文章浏览量显示不正常的问题 刚开始搭建博客,决定给所有文章添加浏览量,并在首页显示 参考了很多教程,但还是遇到了坑,特此记录一下 主要解决了利用LeanCloud解决博客访问量显示不正常的问题 以下内容均转载自我的博客(欢迎访问,手动狗头 ) 使用LeanCloud配置Next主题文章浏览量的坑 关于LeanCloud的配置 可以参考大佬的博客 为Ne...

M010K的博客 1843

生成模型实战 | 基于Transformer生成音乐

本文介绍了基于Transformer架构的音乐生成方法,将音乐视为一系列事件序列进行处理。与将音乐表示为多维图像的MuseGAN不同,该方法使用类似GPT的仅解码器模型,基于先前事件预测下一个音乐事件。模型使用MIDI格式的钢琴音乐数据,通过分词处理将音符转换为note-on、note-off、time-shift和velocity四种事件类型,共388个独特词元,映射为索引序列后输入网络。训练完成后,可通过调整温度参数控制生成音乐的新颖性,从而创作出风格类似训练数据且连贯逼真的音乐作品。

盼小辉丶的博客 5798

Valine评论失效 由于LeanCloud国际版通用域名失效

昨天开始,国内大量使用国际版LeanCloud后端的博客的Valine评论一齐失效。 通过Valine的Github的Issue得知,早在5月份LeanCloud官方就低调表示us.avoscloud.com域名将于不久后下线。 现在如果使用国际版LeanCloud作为Valine评论的后端的话则必须指定自定义服务器URL才能正常使用了。 自定义服务器的URL需要到LeanCloud后台查看。打开后台之后进入Settings - App Keys,找到Domain whitelist,里面的Request

wujiuqier的博客 1853

[关系图谱] 二.Gephi导入共线矩阵构建作者关系图谱

本文主要讲解Gephi绘制作者间的关系图谱,该软件可以广泛应用于社交网络、知识图谱分析,推荐读者使用。这是非常基础的一篇文章,重点讲解Gephi使用方法,希望对大家有所帮助。

杨秀璋的专栏 1万+

RTOS与Linux功能差异与应用场景全面对比

在嵌入式系统的开发中,操作系统的选择至关重要。和是两种广泛应用的操作系统,它们在功能、设计目标以及应用领域中各具优势。随着嵌入式系统的不断发展,已成为嵌入式行业的大趋势。那么,这两者到底有什么不同呢?

硬核科技 400

Next主题无法获取Leancloud阅读次数的问题

2020年1月14日 参考:https://wangyi.blog/2019/12/24/Next%E4%B8%BB%E9%A2%98%E6%97%A0%E6%B3%95%E8%8E%B7%E5%8F%96Leancloud%E9%98%85%E8%AF%BB%E6%AC%A1%E6%95%B0%E7%9A%84%E9%97%AE%E9%A2%98/ 当前我使用的Next主题版本为 v7.6....

Kp0fS的草稿纸 1278

R数据分析:广义估计方程式GEE的做法和解释

好久没有更新文章了,因为同学们咨询的问题有点多,另一个原因就是自己实在太懒。。。。 今天继续给大家写广义估计方程式GEE。 In statistics, a generalized estimating equation (GEE) is used to estimate the parameters of a generalized linear model with a possible unknown correlation between outcomes. 上面的英文解释告诉我们,当我们

Codewar的博客 1万+

只需几个步骤,给网站增加评论和文章浏览量功能!

只需几个步骤,我就成功的在自己的网站中启用 Waline 提供评论与文章浏览量服务。

代码小郭的技术博客 827

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Hexo 部署 valine 评论的 leancloud 设置

文章目录创建对象部署绑定域名自定义环境变量评论管理定时任务邮件通知模板 简 述: 很久之前,就是使用的 valine 的评论系统,实际是在 leancloud 平台进行部署的。也算是之前文章今发。 本文初发于 “偕臧的小站” ifmet.cn,同步转载于此。 创建对象 一开始建议选择 国际版,后面绑定域名可以无需备案。点击 存储 - 创建 Class;名称为 Counter 后点击确认。 在 设置 - 应用 Keys 中记录对应的 AppID 、AppKey 即可;然后填写进 yun 主题的

1919

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

解决LeanCloud流控问题以及配置DaoVoice

最近hexo博客的评论系统valine遇上一点问题,本篇就来记录下我的解决方法。 文章目录1 LeanCloud流控问题2 DaoVoice 1 LeanCloud流控问题 如果用valine评论系统的同学最近打开valine部署的日志可能会发现诸如此类的信息。 事实上我在valine的用户群里有看到相关的官方消息。 其实就是大家都用这套系统,导致有点负载不了。因此官方做了控制。所以解决方式无非就是交钱(付费版不限制)或者用其他方式唤醒LeanCloud。这个的方案目前我看到的有几种,有一位大佬写了博客

胖胖雕的GIS博客 939

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

NexT主题下,用Leancloud统计文章阅读量

1. 配置步骤 1.1 注册LeanCloud账号 1.2 创建应用 1.3 新应用名称(自定义) → 开发版 → 创建即可 1.4 创建Class 在创建的应用上点击存储 数据栏中,_开头的都是系统预定义好的表,为了区分,新建一张表来保存数据。为了保证对NexT主题的修改兼容,新建Class名字必须为Counter。为了避免权限问题导致 次数统计显示不正常,选择无...

对方北方 6683

HEXO博客使用LeanCloud报错“Counter not initialized! See more at console err msg.”

HEXO博客使用LeanCloud报错“Counter not initialized! See more at console err msg.” 具体问题 在根据文档配置好LeanCloud并完成部署之后,刷新博客网页,在主页看到每篇文章的阅读次数都显示为0,而打开每篇文章的相应页面更是发现错误信息:Counter not initialized! More info at console e...

Learn 1671

leancloud 连mysql_LeanCloud-数据库

记录给自己网页添加留言功能的过程。使用工具:LeanCloud,一个自带数据库和增删改查(CRUD)功能的后台系统。在JS中引入LeanCloud官方库在LeanCloud注册并添加应用的步骤: 进入leanCloud官方网站——注册(校验邮箱)——创建应用(不用选什么直接点创建,当然有钱也可以点商用的,随便花,反正我没钱)安装SKD在页面的右上角处点击 帮助——快速入门选择开发语言或平台——选择...

weixin_34184682的博客 235

在个人博客中添加文章点击次数

在个人博客中添加文章点击次数0. 背景介绍我的博客是基于 jekyll + Github pages 。 采用 LeanCloud 作为博客文章访问量的服务器存储。感谢LeanCloud的免费服务。 借鉴了 Hexo 主题 中对 LeanCloud 的支持。 并参考了 如何让 Jekyll 支持文章查看数的统计 和 为博客文章添加阅读量统计功能 ,以及这两个网站中网页的源代码。1. LeanC

Abracadabra的专栏 9917

leancloud mysql混合_LeanCloud-数据库

记录给自己网页添加留言功能的过程。使用工具:LeanCloud,一个自带数据库和增删改查(CRUD)功能的后台系统。在JS中引入LeanCloud官方库在LeanCloud注册并添加应用的步骤: 进入leanCloud官方网站——注册(校验邮箱)——创建应用(不用选什么直接点创建,当然有钱也可以点商用的,随便花,反正我没钱)安装SKD在页面的右上角处点击 帮助——快速入门avatar选择开发语言或...

weixin_32369749的博客 152

leancloud上传图片js_用 JS + LeanCloud 给网页添加数据库(留言功能)

记录给自己网页添加留言功能的过程。使用工具:LeanCloud,一个自带数据库和增删改查(CRUD)功能的后台系统。1 在JS中引入LeanCloud官方库在LeanCloud注册并添加应用的步骤: 进入leanCloud官方网站——注册(校验邮箱)——创建应用(不用选什么直接点创建,当然有钱也可以点商用的,随便花,反正我没钱)安装SKD在页面的右上角处点击 帮助——快速入门选择开发语言或平台—...

weixin_28921621的博客 302

为Hexo加入浏览量的功能

版权声明:此文首发于我的个人站为Hexo加入浏览量的功能,转载请注明出处。 Hexo是和WordPress一样的完善的博客系统,但是好多辅助功能/插件需要是访问谷歌的服务器的,在我大天朝就只能看看了。可是我们勤劳的程序猿们不甘心不那么完美,所以大神们写了各种教程,通过其他的方法解决了因为谷歌而不能使用的功能, 今天就来说说为Hexo博客网站加上的浏览量功能。原理就是使用leancloud作为数据库

Keyon Y的博客 2179

疯狂使用 leancloud (投稿文章)

疯狂使用 leancloud 本文章是投稿文章,已在 leancloud 微信公众号发表。 这里是原文,内容有调整。 3年,从工程师到创始人 觉得不错可以点这里进行 leancloud 注册 项目背景 介绍自己 我是 htoooth,一名爱折腾的工程师,目前在一家电商公司从事 nodejs 的开发工作。自己在技术方面喜欢追新语言,除了主力开发语言 javascript 外,还喜欢 golang,e...

weixin_30856725的博客 179

Android 关于内存权限的问题,坑呀!!!!!!!!!顺便记录一些leancloud的东西

用leancloud作为数据库,在储存图片的时候产生了一些问题 首先是leancloud可以用Pointer来存储对象,但是这个被存储的对象一定要先存好,不然会有问题 final AVObject object = new AVObject("Login"); object.put("id",id); object.put("psw",psw)...

qq_16899143的博客 522
上一篇: 如何根据数组创建二叉树和打印二叉树?
下一篇: 求解斐波那契数列(Fibonacci Numbers)算法居然有9种,你知道哪几种吗?
tcpipstack
博客等级 码龄14年 329粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值