Node.js开发中的那些旮旮角角 第一部

前戏

上一周是我到现公司来最忙碌的(最有意思的)一周了,为什么这么说呢?因为项目中需要提供服务端对用户病人信息的一个汇总并以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马(留意下文件名)

Node.js开发中的那些旮旮角角 第一部_第1张图片
Paste_Image.png

分批次取数据

先讲解下前提,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个异步的 && 根据上一个方法的结果来干下一件事 {
那么你的代码就会变成一个阶梯状,一层嵌套一层,不移维护也不易阅读
}

最后附上,我心情劳动后,上天也被感动,给力我一个超可爱的喵星人,也要感谢在开发过程支持和帮助我的某某人!!!

Node.js开发中的那些旮旮角角 第一部_第2张图片
![IMG_0395.JPG](http://upload-images.jianshu.io/upload_images/1530185-d6cb759bb8687d07.JPG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

下部预告,《测试达人带飞,让你装逼让你吹》

你可能感兴趣的:(Node.js开发中的那些旮旮角角 第一部)