Tsuk1ko / nhentai-resolver

nhentai resolver based on Node.js 基于nodejs的nhentai本子解析api
GNU General Public License v3.0
7 stars 0 forks source link

关于..http三次成功一次的问题.. #2

Closed Zephylaci closed 6 years ago

Zephylaci commented 6 years ago

实际之后我基于你这个重构了一套....这个问题就没有复现了.. 推测可能的原因: 错误处理的问题

   单页面解析函数里有这么一段...
    if (tittle1 === null) {
        return null;
    }
   ......
    if (searchRes !== null) {
        nhImgID = searchRes[0].replace(/\//g, '');
    } else {
        return null;
    }
//这两个判断,虽然看你上层似乎判断了是Null返回无结果,但有的时候就卡住了,超时失败..
因为代码不健壮..假如连续多次点击,比如上次请求没结束直接有新的请求进来...大概率结果不符合预期..
而你这个正则判断偶尔会失败..概率还不小..

所以我解决的时候,这里搞成promise的形式,每下一次进入前强行结束上一次并清空(这里其实应该写成类每次请求新建一个,彼此之间不影响,只是改完才意识到..后面一直没改)..同时把正则判断换成字符串截取(网址url长度几乎是一定的..),同时出错不返回null而是赋予一个错误值(一定会有返回值且,return位置唯一,结果相对可控...),然后就没遇到过这个问题了.. 具体其实你可以看我fork的版本..虽然只重构了单页面解析..多页面其实加个循环..也差不多.. 最后关于全局变量... 我设想过,用全局变量进行缓存,查询的时候如果存在直接返回指不存在再去爬取,定期存sql...服务运行的时候一次性从sql中,读出来..太多的话,设置权值读取前多少条,和所有的id..如果存在但不在缓存就去sql查询..感觉效率会高不少.. 就是不知道Node服务端的全局变量是所有用户共用的还是每个链接一个..我感觉应该是所有用户共用的..asp.net就是这样..不过没有去测试..

Tsuk1ko commented 6 years ago

一语惊醒梦中人

提到正则表达式匹配会失败的问题,我去调试了一下确实如此,并且很奇怪的是明明获取html是成功的,获取某个元素的内容也是正常的,但是正则表达式匹配出来的结果是空的

然后意识到是全局变量的原因(之前没意识到其实正则表达式也是类

把正则表达式改成局部变量后,问题就解决了,看来很多地方还是得养成好习惯

至于全局变量我觉得是和会话线程绑定,之前我测试的时候发现在当前页面刷新或者仅仅是更改url然后访问,都会出现正则取不到匹配的那个问题(在我已经不将require('./resolve')作为全局变量的情况下),而如果我新开一个隐私模式窗口或者等超时再重新连接就不会出现那个问题

因此十分推荐把require('cheerio')也作为局部变量

至于您提的对于缓存解析结果的思路我会好好考虑下

看到大佬都已经做出前端了,以后还得跟您多学习XD