日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/11/29 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Node js开发中的那些旮旮角角 第一部 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

#前戲

上一周是我到現(xiàn)公司來最忙碌的(最有意思的)一周了,為什么這么說呢?因為項目中需要提供服務端對用戶病人信息的一個匯總并以email的形式分享信息的接口,在幾天的時間里調研處理一套實施方案。我們服務端是Node.js實現(xiàn)的(其中的npm中有很多豐富的第三方庫來解放你重新造輪子的尷尬)

###配方 pug->html-pdf->pdf2png->s3->sendgrid

#pug 中在phantom中字體無效的解決方案 在開發(fā)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;} 復制代碼

嗯,模板文件算是搞定了,接下來就是具體代碼的實現(xiàn)了。

準備數(shù)據(jù)材料

要做某件事情肯定都會先把需要的材料先搞到手把!(感覺編程和現(xiàn)實生活中解決問題的思路很多都是想通的)

我是受到某人的啟發(fā)說通過一個匯總鏈表查詢,把N張表的數(shù)據(jù)都通過一個查詢搞出來,最后把它變成View,也方便服務端的開發(fā),我這么一聽感覺是很有道理啊,那就做吧(我感覺我執(zhí)行力好強?)

在我們的系統(tǒng)有些表的設置是字段可以方便增加字段類型,但在查詢時就必須要考慮行轉列,或是列轉行(這在我之前都是未知領域)

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很好的區(qū)分出來。所以只好老實的在Node.js中分批的查詢其中的數(shù)據(jù)。放一張截圖,肯定能體會出我心中N多的XX馬(留意下文件名)

###分批次取數(shù)據(jù) 先講解下前提,customDiagnoses和patientDiagnoses表是1->N的關系。

const customDiagnoses = await Promise.all(patientDiagnoses.map(item =>CustomDiagnosis.findById(item.sourceId)) ) 復制代碼

Promise.all()是需要等待其中的所有的方法都完全處理完后再執(zhí)行后面的語句

這里可以補充一個《如何把一個異步的方法搞成一個看似同步的方法》

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

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

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

總結

以上是生活随笔為你收集整理的Node js开发中的那些旮旮角角 第一部的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。