业务平台EasyBPM(易实管理软件)有一个功能是模板打印的功能。就是可以使用一个docx格式的模板,输出一个docx格式的单据的文档。

打印的逻辑是先从服务端获取模板,如果没有对应的模板,就提示先上传模板:

EasyBPM打印模板的缓存问题-LMLPHP

遇到的问题是,按照提示上传模板之后,再次打印依然会报没有模板。

缓存的问题

通过思考发现,可能的原因是因为使用了缓存。 后端使用Node + Express进行静态资源的发布。 通过Express发布的资源,默认会开启缓存。

所以当第一次去获取模板资源的时候,由于此时没有对应的模板,此时会跳转到404页面,返回给前端,前端解析404页面发现不是模板文件,就会提示没有模板文件。

之后上传了模板文件到后端的静态资源目录,再次去获取模板资源的时候,由于此时已经缓存的结果是404文件,所以前端获取的依然是404页面,而不是模板文件,因此会继续提示没有模板文件。

如果去掉缓存

要解决这个问题,就需要去掉模板文件的缓存功能。 一般来说,在请求的header上面可以可以设置不使用缓存。

但是一个简单的方式是,给url地址加上时间戳,比如如下代码:

 var getTemplateFunction = function () {
        return `./print/${page.model.id}打印模板.docx?time=${new Date().getTime()}`;
 };

在后面加上"?time=${new Date().getTime()}" 之后,由于每次请求的url地址都不在一样,这个时候就不会使用缓存,而是总是获取最新的文件。 这样就可以轻松解决了这个缓存的问题。

实践也是如此,加上时间戳之后,上述问题就不在复现了。

缓存

有关缓存的原理和相关知识 ,强缓存,协商缓存,Cache Control, Expires,from disk cache和from memory cache,ETag和If-None-Match,Last-Modified和If-Modified-Since等等,可以百度之,网上相关的介绍很多,此处不在赘述。

总结

其实想强调一点,底层认知还是很重要的,如果遇到这个问题,你至少要知道缓存相关的知识,才能够想到有可能是缓存导致的问题。 如果你都不知道缓存相关原理和知识,估计就很难想到了。

EasyBPM(易施业务流程管理平台),是一个低代码业务平台。 可以自定义物业表单,定义业务流程,审批流程,报表,权限等等。 通过该平台可以组建CRM,进销存,OA, 资产管理等业务管理平台。有兴趣的可以关注。

更多优秀内容,欢迎关注公众号 “易施管理软件EasyBPM” 。

05-23 18:29