前戏
上一周是我到现公司来最忙碌的(最有意思的)一周了,为什么这么说呢?因为项目中需要提供服务端对用户病人信息的一个汇总并以email的形式分享信息的接口,在几天的时间里调研处理一套实施方案。我们服务端是Node.js实现的(其中的npm中有很多丰富的第三方库来解放你重新造轮子的尴尬)
配方
pug
->html-pdf
->pdf2png
->s3
->sendgrid
pug 中在phantom中字体无效的解决方案
在开发pug时遇到一个比较棘手的问题,设计定的字体在浏览器上是有效果的,但是通过Phantom.js(服务器端的 JavaScript API 的 WebKit)进行网页截图时,字体却都使用了默认字体,后来只有通过自定义字体文件才解决这个问题。
style.
@font-face {
font-family: CustomFont;
src: url('./views/fonts/HelveticaNeue.otf');
}
.gender {
display: inline;
color: rgb(102, 102, 102);
font-family: CustomFont;
}
嗯,模板文件算是搞定了,接下来就是具体代码的实现了。
准备数据材料
要做某件事情肯定都会先把需要的材料先搞到手把!(感觉编程和现实生活中解决问题的思路很多都是想通的)
我是受到某人的启发说通过一个汇总链表查询,把N张表的数据都通过一个查询搞出来,最后把它变成View,也方便服务端的开发,我这么一听感觉是很有道理啊,那就做吧(我感觉我执行力好强☺)
在我们的系统有些表的设置是字段可以方便增加字段类型,但在查询时就必须要考虑行转列,或是列转行(这在我之前都是未知领域)
select patient_id, max(IF(contact_type = 'email',value,null)) as 'email', max(IF(contact_type = 'address',value,null)) as 'address', group_concat(case when contact_type='mobile' then contacts.value end) as 'mobiles'
from contacts where contacts.is_deleted = 0 group by patient_id
max(IF(contact_type = 'email',value,null) 可以将列中符合contact_type='email' 的提出来单独作为一列;group_concat(case when contact_type='mobile' then contacts.value end) 则可以将多个类型的通过拼接放在一个单元格中。不过最后遇到一个问题,就是无法将多个mobile很好的区分出来。所以只好老实的在Node.js中分批的查询其中的数据。放一张截图,肯定能体会出我心中N多的XX马(留意下文件名)
分批次取数据
先讲解下前提,customDiagnoses和patientDiagnoses表是1->N的关系。
const customDiagnoses = await Promise.all(
patientDiagnoses.map(item =>
CustomDiagnosis.findById(item.sourceId)
)
)
Promise.all()是需要等待其中的所有的方法都完全处理完后再执行后面的语句
这里可以补充一个《如何把一个异步的方法搞成一个看似同步的方法》
static async exportPDF(html, options, filePath) {
const promise = new Promise((reslove, reject) => {
const callback = (err, res) => {
if (err) {
reject(err)
return
}
reslove(res)
}
pdf.create(html, options).toFile(filePath, callback)
})
return promise
}
Promise顾名思义就是当你达成某种成就了,我就会帮你干某件事。
写一个Promise最有变化就是对callback的处理,其他的基本都跟这个差不多,使用Promise也很简单,直接在调用的地方前面加上一个await即可。
有人会问了为什么要写Promise啊?Node.js 不是都是有callback的吗?干嘛还要我多次一举?
起始也不完全都要把异步方法用Promise封装起来,但是if 你的一个方法中有N个异步的 && 根据上一个方法的结果来干下一件事 {
那么你的代码就会变成一个阶梯状,一层嵌套一层,不移维护也不易阅读
}
最后附上,我心情劳动后,上天也被感动,给力我一个超可爱的喵星人,也要感谢在开发过程支持和帮助我的某某人!!!
下部预告,《测试达人带飞,让你装逼让你吹》