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個異步的 && 根據上一個方法的結果來干下一件事 { 那么你的代碼就會變成一個階梯狀,一層嵌套一層,不移維護也不易閱讀 }

最后附上,我心情勞動后,上天也被感動,給力我一個超可愛的喵星人,也要感謝在開發過程支持和幫助我的某某人!!!

下部預告,《測試達人帶飛,讓你裝逼讓你吹》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390525.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390525.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390525.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

文件2. 文件重命名

servlet對本機已存在的文件進行重命名。 .jsp界面 1 <form action"<%basePath %>fileAction" method"get" >2 <table>3 <tr>4 <td>輸入文件路徑</td>5 <td&…

js字符串slice_JavaScript子字符串示例-JS中的Slice,Substr和Substring方法

js字符串sliceIn daily programming, we often need to work with strings. Fortunately, there are many built-in methods in JavaScript that help us while working with arrays, strings and other data types. We can use these methods for various operations like sea…

leetcode 218. 天際線問題

城市的天際線是從遠處觀看該城市中所有建筑物形成的輪廓的外部輪廓。給你所有建筑物的位置和高度&#xff0c;請返回由這些建筑物形成的 天際線 。 每個建筑物的幾何信息由數組 buildings 表示&#xff0c;其中三元組 buildings[i] [lefti, righti, heighti] 表示&#xff1a…

[Android Pro] 終極組件化框架項目方案詳解

cp from : https://blog.csdn.net/pochenpiji159/article/details/78660844 前言 本文所講的組件化案例是基于自己開源的組件化框架項目github上地址github.com/HelloChenJi…其中即時通訊(Chat)模塊是單獨的項目github上地址github.com/HelloChenJi… 1.什么是組件化&#xff…

如何寫一個vue指令directive

舉個例子 &#xff1a;clickoutside.js const clickoutsideContext clickoutsideContext;export default {/*param el 指令所綁定的元素param binding {Object} param vnode vue編譯生成的虛擬節點*/bind (el, binding, vnode) {const documentHandler function(e) {console.…

安裝angular cli_Angular 9適用于初學者—如何使用Angular CLI安裝第一個應用程序

安裝angular cliAngular is one of the most popular JavaScript frameworks created and developed by Google. In the last couple of years, ReactJS has gained a lot of interest and has become the most popular modern JS library in the industry. But this doesn’t …

leetcode 1818. 絕對差值和

給你兩個正整數數組 nums1 和 nums2 &#xff0c;數組的長度都是 n 。 數組 nums1 和 nums2 的 絕對差值和 定義為所有 |nums1[i] - nums2[i]|&#xff08;0 < i < n&#xff09;的 總和&#xff08;下標從 0 開始&#xff09;。 你可以選用 nums1 中的 任意一個 元素來…

【轉載】keil5中加入STM32F10X_HD,USE_STDPERIPH_DRIVER的原因

初學STM32&#xff0c;在RealView MDK 環境中使用STM32固件庫建立工程時&#xff0c;初學者可能會遇到編譯不通過的問題。出現如下警告或錯誤提示&#xff1a; warning: #223-D: function "assert_param" declared implicitly;assert_param(IS_GPIO_ALL_PERIPH(GPIOx…

下崗職工_下崗后我如何獲得多位軟件工程師的面試

下崗職工“Opportunities to find our deeper powers come when life seems most challenging.” -Joseph Campbell“當生活似乎最具挑戰性時&#xff0c;就有機會找到我們更深層的力量。” 約瑟夫坎貝爾 I was recently laid off for the first time in my life. I realized t…

1846. 減小和重新排列數組后的最大元素

給你一個正整數數組 arr 。請你對 arr 執行一些操作&#xff08;也可以不進行任何操作&#xff09;&#xff0c;使得數組滿足以下條件&#xff1a; arr 中 第一個 元素必須為 1 。任意相鄰兩個元素的差的絕對值 小于等于 1 &#xff0c;也就是說&#xff0c;對于任意的 1 <…

bashdb常用命令

一、列出代碼和查詢代碼類&#xff1a; l 列出當前行以下的10行- 列出正在執行的代碼行的前面10行. 回到正在執行的代碼行w 列出正在執行的代碼行前后的代碼/pat/ 向后搜索pat&#xff1f;pat&#xff1f;向前搜索pat二、Debug控制類&#xff1a; h 幫助help 命令 得到…

podcast播客資源_為什么播客是我的新維基百科-完美的非正式學習資源

podcast播客資源In this article, I’ll explain why podcasts replaced a lot of my Wikipedia usage for informal learning. I’ll also talk about how I listen to 5 hours of podcasts every day.在本文中&#xff0c;我將解釋為什么播客代替了我的許多Wikipedia用于非正…

劍指 Offer 53 - I. 在排序數組中查找數字 I(二分法)

統計一個數字在排序數組中出現的次數。 示例 1: 輸入: nums [5,7,7,8,8,10], target 8 輸出: 2 示例 2: 輸入: nums [5,7,7,8,8,10], target 6 輸出: 0 限制&#xff1a; 0 < 數組長度 < 50000 解題思路 先用二分法查找出其中一個目標元素再向目標元素兩邊查找…

MVC與三層架構區別

我們平時總是將三層架構與MVC混為一談&#xff0c;殊不知它倆并不是一個概念。下面我來為大家揭曉我所知道的一些真相。 首先&#xff0c;它倆根本不是一個概念。 三層架構是一個分層式的軟件體系架構設計&#xff0c;它可適用于任何一個項目。 MVC是一個設計模式&#xff0c;它…

tensorflow 實現邏輯回歸——原以為TensorFlow不擅長做線性回歸或者邏輯回歸,原來是這么簡單哇!...

實現的是預測 低 出生 體重 的 概率。尼克麥克盧爾&#xff08;Nick McClure&#xff09;. TensorFlow機器學習實戰指南 (智能系統與技術叢書) (Kindle 位置 1060-1061). Kindle 版本. # Logistic Regression #---------------------------------- # # This function shows ho…

sdlc 瀑布式 生命周期_SDLC指南–軟件開發生命周期的階段和方法

sdlc 瀑布式 生命周期When I decided to teach myself how to code almost four years ago I had never heard of, let alone thought about, the software development life cycle.當我差不多四年前決定教自己如何編碼時&#xff0c;我從未聽說過軟件開發生命周期&#xff0c;…

劍指 Offer 48. 最長不含重復字符的子字符串

請從字符串中找出一個最長的不包含重復字符的子字符串&#xff0c;計算該最長子字符串的長度。 示例 1: 輸入: “abcabcbb” 輸出: 3 解釋: 因為無重復字符的最長子串是 “abc”&#xff0c;所以其長度為 3。 示例 2: 輸入: “bbbbb” 輸出: 1 解釋: 因為無重復字符的最長子…

Mysql-my-innodb-heavy-4G.cnf配置文件注解

Mysql-同Nginx等一樣具備多實例的特點&#xff0c;簡單的講就是在一臺服務器上同時開啟多個不同的服務端口&#xff08;3306,3307&#xff09;同時運行多個Mysql服務進程&#xff0c;這些服務進程通過不同的socket監聽不同的服務端口來提供服務。這些Mysql多實例公用一套Mysql安…

is 和 == 的區別

is 和 操作符的區別 python官方解釋&#xff1a; 的meaning為equal&#xff1b; is的meaning為object identity&#xff1b; is 判斷對象是否相等&#xff0c;即身份是否相同&#xff0c;使用id值判斷&#xff1b; 判斷對象的值是否相等。id值是什么&#xff1f;id()函數官網…

win10管理凌亂桌面_用于管理凌亂的開源存儲庫的命令行技巧

win10管理凌亂桌面Effective collaboration, especially in open source software development, starts with effective organization. To make sure that nothing gets missed, the general rule, “one issue, one pull request” is a nice rule of thumb.有效的協作(特別是…