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马(留意下文件名)
###分批次取数据 先讲解下前提,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开发中的那些旮旮角角 第一部相关推荐
- 详解Node.js开发中不可或缺的7个库
在Node.js开发中,选择合适的库对于提高开发效率和优化应用程序性能至关重要.本文将介绍七个备受关注的Node.js库,它们在各自的领域中展现了出色的功能和性能.这些库分别是:Config.Fetc ...
- node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用(转)
在开发或调试Node.js应用程序的时候,当你修改js文件后,总是要按下CTRL+C终止程序,然后再重新启动,即使是修改一点小小的参数,也总是要不断地重复这几个很烦人的操作.有没有办法做到当文件修改之 ...
- 《Node.js开发实战》代码下载、简介与前言
请下载代码评估:https://pan.baidu.com/s/1qYC3cVa (密码: bba3). 内容简介 本书以实战开发为原则,以Node.js原生知识和框架实战为主线,详细介绍Node ...
- 10个Node.js 开发人员必须使用的IDE
英文 | https://javascript.plainenglish.io/top-10-best-node-ide-every-developer-must-check-out-96a69950 ...
- 《Node.js开发指南》书评汇总
刚查了下库存,发现订阅<Node.js开发指南>的读者大增,这是为什么呢?看了下近期本书在豆瓣的评论,口碑很好,现将豆瓣的书评汇总如下: ------------------------- ...
- 计算机系统的搭建步骤,电脑搭建Node.js开发环境的操作教程[多图]
电脑如何搭建Node.js开发环境?近日有用户询问怎么在Win7系统电脑上搭建Node.js开发环境,今天教程之家就给大家分享Node.js开发环境的搭建教程. 操作步骤: 1.下载Node.js官方 ...
- 83998 连接服务器出错_新生福利 | 使用 Node.Js 开发服务器
点击蓝字关注,创智助你长姿势 Node.js 是一个 Javascript 运行环境 (runtime),发布于 2009 年 5 月,由 Ryan Dahl 开发.实际上它是对 Google V8 ...
- Koa与Node.js开发实战(1)——Koa安装搭建(视频演示)
2019独角兽企业重金招聘Python工程师标准>>> 学习架构: 由于Koa2已经支持ES6及更高版本,包括支持async方法,所以请读者保证Node.js版本在7.6.0以上.如 ...
- nodec mysql_Node.js 连接 MySQL 并进行数据库操作 –node.js 开发指南
Node.js是一套用来编写高性能网络服务器的JavaScript工具包 通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选,本篇就来 ...
最新文章
- 角度编码器 ST-3806-15-RS
- 通过ssh建立点对点的隧道,实现两个子网通信
- 放出php压缩HTML函数,轻松压缩html、js和Css
- linux 运行ca.crt,linux下使用openssl生成 csr crt CA证书,opensslcsr
- 服务器提交协议冲突 Section=ResponseStatusLine 的解决办法
- 学成在线案例——黑马程序员pink老师\思路讲解\完整源代码
- 嵌入式工作笔记0006---半导体中的IP核是什么意思
- gambit2.4证书免费分享
- AI新生 人类最后一个大问题 破解人机共存密码 Human Compatible Stuart Russell
- 图像相似度的评价指标 : FID(Fréchet Inception Distance)
- KeilC51基础 改变代码的字体大小
- html折线图坐标轴怎么设置,Excel折线图怎么设置坐标轴起点不为0
- cesium获取当前屏幕中心点坐标
- Banner 图片轮播
- 【装机吧U盘装系统】
- java中类变量和实例变量
- [软件安装] Apache Httpd 安装教程
- 数字IC开发软件介绍
- 蓄电池电压检测单元 电池监控模块 24路电池电压采样模块电源检测
- 边缘设备、系统及计算杂谈(2)——go语言
热门文章
- golang判断结构体为空_如何在Golang中检查结构是否为空?
- fastjson转换时有大括号或者冒号或者有中括号_[Python Basic] 字符串处理以及类型转换 1...
- php的list函数
- linux中将光标与操作系统,linux操作系统基本命令介绍(2)
- 122. 买卖股票的最佳时机 II golang
- LeetCode【5--最长的回文子串】 LeetCode【6--Z字形变换】
- 软件工程---1.概述
- QT子线程与主线程的信号槽通信
- Python3小知识
- Java架构师教你如何突破瓶颈,持续更新中