业务平台EasyBPM(易实管理软件)有一个功能是模板打印的功能。就是可以使用一个docx格式的模板,输出一个docx格式的单据的文档。
打印的逻辑是先从服务端获取模板,如果没有对应的模板,就提示先上传模板:
遇到的问题是,按照提示上传模板之后,再次打印依然会报没有模板。
缓存的问题
通过思考发现,可能的原因是因为使用了缓存。 后端使用Node Express进行静态资源的发布。 通过Express发布的资源,默认会开启缓存。
所以当第一次去获取模板资源的时候,由于此时没有对应的模板,此时会跳转到404页面,返回给前端,前端解析404页面发现不是模板文件,就会提示没有模板文件。
之后上传了模板文件到后端的静态资源目录,再次去获取模板资源的时候,由于此时已经缓存的结果是404文件,所以前端获取的依然是404页面,而不是模板文件,因此会继续提示没有模板文件。
如果去掉缓存
要解决这个问题,就需要去掉模板文件的缓存功能。 一般来说,在请求的header上面可以可以设置不使用缓存。
但是一个简单的方式是,给url地址加上时间戳,比如如下代码:
代码语言:javascript复制 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, 资产管理等业务管理平台。