#前戏

上一周是我到现公司来最忙碌的(最有意思的)一周了,为什么这么说呢?因为项目中需要提供服务端对用户病人信息的一个汇总并以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个异步的 && 根据上一个方法的结果来干下一件事 { 那么你的代码就会变成一个阶梯状,一层嵌套一层,不移维护也不易阅读 }

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

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

Node js开发中的那些旮旮角角 第一部相关推荐

  1. 详解Node.js开发中不可或缺的7个库

    在Node.js开发中,选择合适的库对于提高开发效率和优化应用程序性能至关重要.本文将介绍七个备受关注的Node.js库,它们在各自的领域中展现了出色的功能和性能.这些库分别是:Config.Fetc ...

  2. node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用(转)

    在开发或调试Node.js应用程序的时候,当你修改js文件后,总是要按下CTRL+C终止程序,然后再重新启动,即使是修改一点小小的参数,也总是要不断地重复这几个很烦人的操作.有没有办法做到当文件修改之 ...

  3. 《Node.js开发实战》代码下载、简介与前言

    请下载代码评估:https://pan.baidu.com/s/1qYC3cVa   (密码: bba3). 内容简介 本书以实战开发为原则,以Node.js原生知识和框架实战为主线,详细介绍Node ...

  4. 10个Node.js 开发人员必须使用的IDE

    英文 | https://javascript.plainenglish.io/top-10-best-node-ide-every-developer-must-check-out-96a69950 ...

  5. 《Node.js开发指南》书评汇总

    刚查了下库存,发现订阅<Node.js开发指南>的读者大增,这是为什么呢?看了下近期本书在豆瓣的评论,口碑很好,现将豆瓣的书评汇总如下: ------------------------- ...

  6. 计算机系统的搭建步骤,电脑搭建Node.js开发环境的操作教程[多图]

    电脑如何搭建Node.js开发环境?近日有用户询问怎么在Win7系统电脑上搭建Node.js开发环境,今天教程之家就给大家分享Node.js开发环境的搭建教程. 操作步骤: 1.下载Node.js官方 ...

  7. 83998 连接服务器出错_新生福利 | 使用 Node.Js 开发服务器

    点击蓝字关注,创智助你长姿势 Node.js 是一个 Javascript 运行环境 (runtime),发布于 2009 年 5 月,由 Ryan Dahl 开发.实际上它是对 Google V8 ...

  8. Koa与Node.js开发实战(1)——Koa安装搭建(视频演示)

    2019独角兽企业重金招聘Python工程师标准>>> 学习架构: 由于Koa2已经支持ES6及更高版本,包括支持async方法,所以请读者保证Node.js版本在7.6.0以上.如 ...

  9. nodec mysql_Node.js 连接 MySQL 并进行数据库操作 –node.js 开发指南

    Node.js是一套用来编写高性能网络服务器的JavaScript工具包 通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选,本篇就来 ...

最新文章

  1. 角度编码器 ST-3806-15-RS
  2. 通过ssh建立点对点的隧道,实现两个子网通信
  3. 放出php压缩HTML函数,轻松压缩html、js和Css
  4. linux 运行ca.crt,linux下使用openssl生成 csr crt CA证书,opensslcsr
  5. 服务器提交协议冲突 Section=ResponseStatusLine 的解决办法
  6. 学成在线案例——黑马程序员pink老师\思路讲解\完整源代码
  7. 嵌入式工作笔记0006---半导体中的IP核是什么意思
  8. gambit2.4证书免费分享
  9. AI新生 人类最后一个大问题 破解人机共存密码 Human Compatible Stuart Russell
  10. 图像相似度的评价指标 : FID(Fréchet Inception Distance)
  11. KeilC51基础 改变代码的字体大小
  12. html折线图坐标轴怎么设置,Excel折线图怎么设置坐标轴起点不为0
  13. cesium获取当前屏幕中心点坐标
  14. Banner 图片轮播
  15. 【装机吧U盘装系统】
  16. java中类变量和实例变量
  17. [软件安装] Apache Httpd 安装教程
  18. 数字IC开发软件介绍
  19. 蓄电池电压检测单元 电池监控模块 24路电池电压采样模块电源检测
  20. 边缘设备、系统及计算杂谈(2)——go语言

热门文章

  1. golang判断结构体为空_如何在Golang中检查结构是否为空?
  2. fastjson转换时有大括号或者冒号或者有中括号_[Python Basic] 字符串处理以及类型转换 1...
  3. php的list函数
  4. linux中将光标与操作系统,linux操作系统基本命令介绍(2)
  5. 122. 买卖股票的最佳时机 II golang
  6. LeetCode【5--最长的回文子串】 LeetCode【6--Z字形变换】
  7. 软件工程---1.概述
  8. QT子线程与主线程的信号槽通信
  9. Python3小知识
  10. Java架构师教你如何突破瓶颈,持续更新中