终于填了 hapijs 中的 catbox 组件的坑

起因

由于最近在开发恒星币的钱包,其中有部分数据,如果直接通过恒星的 API 获取则效率太低,影响页面展示体验。
于是用 hapijs 来开发一些定制的接口,批量获取并缓存数据,来提升页面访问效果。

之前在 《使用 hapijs 快速构建自己的 api 服务》 这篇文章中有写到 hapijs 默认使用 catboxcatbox-memory 组件来缓存数据。

我这次还是按照上次的方法来使用缓存,但是却没有成功,每次提交请求,都是重新去获取数据,而没有走缓存。

祸起文档和配置

翻了好几遍 hapijs 的文档,也使用搜索引擎查了,折腾了3个多小时无果,最终决定一边读源码一边在代码加标记输出。

在每个关键位置都打了输出,但是没有看到任何报错和问题。无意中看到了 hapijs 文档中的一个配置参数 generateOnReadError),作用是当在读取缓存时遇到错误时是否报错,而默认则是关掉的!!!WTF!!!!

配置这个参数为 false 后,得再配合 try {} catch () {} 才显示了错误信息,原来是缓存的 key 非法。

比较这次和上次使用 cache 功能的代码,找到了一个不同点,就是上次是使用的 string 作为 key,而这次使用的是 object 作为 key

不过在 hapijs 关于 cache文档) 中,关于 generateFunc 参数的解释里有一句 the \id` string or object provided to the `get()` method.,看上去idobject` 也没有问题啊。

于是我又去读了 catbox 的源码,最终看到 catbox 的一段关于获取缓存信息的 代码

在第88行,原来特么的只接受 {id: id} 这种样子的对象啊?!!!!并且上面82行的注释也列出来了。。。

又去看了下 catbox 的文档中关于 get() 方法的介绍,有这么一句 id - the unique item identifier (within the policy segment). Can be a string or an object with the required 'id' key.

这就恍然大悟了。。。。。。。。。

原来对象中必须包含 id 这个字段啊,原来要是提交对象的话,需要自己来定义索引啊?!!!

修改下代码,这个坑过了。

不容易不容易啊。。