1. 程式人生 > >那些年,在nodejs上踩過的坑(一)

那些年,在nodejs上踩過的坑(一)

自己寫nodejs也有一段時間,踩過很多坑(而且大部分是自己給自己埋),也見過很多別人踩過的坑,原因其實也很簡單,要麼是對這個知識點理解不夠深入,要麼就是編碼的習慣不好。這段響應朋春大牛的號召,打算陸陸續續整理下這些坑,算是給自己一個備忘,同時也希望能對大家有所幫助。

1. callback

事件回撥是nodejs非常常見的一個應用場景,那大家先來看看以下這段程式碼是否存在什麼問題?

get(params,function(err, data){if(err){
   callback(err);}//對data進行操作var row = data[0];});

看出來了吧。對,就是err存在時,callback之後,接下來的程式碼還是要執行的。而這時,data值是什麼,我們往往是沒辦法控制的。如果data這時返回的是undefined,那麼就悲劇了,程式肯定報錯。當然解決方法很簡單,就是在callback之前加個return即可:

get(params,function(err, data){if(err){return callback(err);}//對data進行操作var row = data[0];});

這個知識點並不是很難,但往往是初學者特別容易犯的錯,甚至已經寫了很久程式碼的同學也會偶爾犯這種低階錯誤。

再來一個更隱蔽的:

db.get(key,function(err, data){if(err){return callback(err);}try{
    callback(null, JSON.parse(data.toString()))}catch(e){
    callback(e);}});

看似沒有任何問題吧。嘿嘿,揭曉答案, 對,被回撥兩次。callback(null, Error)一次,callback(e),具體比如:

function asyncfun(data, callback){try{
    callback(null, JSON.parse(data.toString()));}catch(e){
    callback(e);}}var json ={'a':'b'};var jsonstr = JSON.stringify(json);var d =newBuffer(jsonstr);

asyncfun(d,function(err, data){
  console.log(err);thrownewError('new Error');});

執行結果:

null[Error:new
Error]

這在一個大專案絕對是坑爹了,排錯都需要很久。

ps:之前的描述存在問題,謝謝蘇千的指正。

2. buffer

還是老規矩,先看程式碼:

var data ="";  
res.on('data',function(chunk){  
  data += chunk;}).on("end",function(){});

這段程式碼在chunk都是ascii碼資料或者資料量比較少時是沒有問題,但如果你的資料是大量中文的話,恭喜你,中槍了,會出現亂碼。其原因是兩個chunk(Buffer物件)的拼接並不正常,相當於進行了buffer.toString() + buffer.toString()。如果buffer不是完整的,則toString出來後的string是存在問題的(比如一箇中文字被截斷)。具體可以參見樸靈寫得這篇文章:http://cnodejs.org/topic/4faf65852e8fb5bc65113403

3. 深度巢狀

很多剛開始寫nodejs程式碼的人,由於思路還停留在同步的思維,所以或多或少寫過這樣的程式碼:

func1(err,function(err1, data1){
  func2(err1,function(err2, data2){
    func3(err3,function(err3, data3){
      func4(err4,function(err4, data4){.......})})})})

先別說這樣的程式碼是否易於維護,光樣子就夠難看,程式碼都“斜”了。不怕大家恥笑,我自己剛開始就寫時也寫過這樣“坑爹”的程式碼,為此自己當時還寫了篇《如何讓nodejs同步操作》講如何解決這個問題。不過從源頭上,大家還是要儘量避免採用這種同步的方法,因為nodejs得優勢就在於非同步,硬生生要做成同步絕對吃力不討好。

來源:https://cnodejs.org/topic/4fc7789a8be5d070121141cd

相關推薦

資料治理:那些我們一起

寫在前面: 這是一個系列文章,沉澱了我在資料治理領域的一些實踐和思考。共分為5篇。分別是: 一、資料治理:那些年,我們一起踩過的坑 主要講講資料治理工作中常見的一些誤區。 二、要打仗,你手裡先得有張地圖:資料治理之元資料管理 這一篇講講元資料的概念和具體應用場景。 三、不忘初

那些我們一起的 “Android

69、多執行緒同時訪問集合(ConcurrentModificationException) 問題現象: 多執行緒同時修改集合時常常容易出現 ConcurrentModificationException ,即便是改成用 Collections.synch

那些在WebView

之前我在Android中使用WebView與JS互動全解析一文中,介紹了通過Webview和JS的互動方式,但Webview這個控制元件簡直是讓人又愛又恨,各種你想不到的錯誤在各種奇怪的手機上,各種不一樣的版本里,所以我想通過這篇部落格總結Webview開發中的

那些nodejs

自己寫nodejs也有一段時間,踩過很多坑(而且大部分是自己給自己埋),也見過很多別人踩過的坑,原因其實也很簡單,要麼是對這個知識點理解不夠深入,要麼就是編碼的習慣不好。這段響應朋春大牛的號召,打算陸陸續續整理下這些坑,算是給自己一個備忘,同時也希望能對大家有所幫助。 1.

那些nodejs

原文:http://cnodejs.org/topic/4fc7789a8be5d070121141cd ----------------------------------------------------------- 自己寫nodejs也有一段時間,踩過很多坑(而

談談那些微信支付

很早的時候就想寫這篇文章了,作為BAT中的一員,還真不想吐槽它,免得被人身攻擊。有人說,微信支付很簡單嘛,官網有例子,網上也有現成的例子,不過誰用誰知道,本人也是在深入瞭解之後,真心覺得微信支付裡的坑太多,BAT的開發們太敷衍了事,結果給不少的其他開發者帶來諸多麻煩。我在這裡做個稍全一點的介紹,儘

那些在某廠

不知道 包含 遇到 積累 shel 經驗 tar.gz 開源 態度 某廠人多勢眾,自己造輪子,不用開源,於是可苦了外來人,外來所有積累的經驗都沒有用了,同時在這個廠積累的經驗到外面又沒啥用。呵呵 自己造的輪子,文檔極少,遇到坑了只能找客服,客服毛個態度,愛管不管,沒法子啊

那些深度學習所-第一

博主在學習簡單的深度學習的時候用的是mac電腦,正是因為用的是這個電腦,所以說在跑程式碼的時候遇到過很多坑,因此決定將那些年踩過的坑全部記錄下來。 由於看的論文主要是關於C3D卷積神經網路的,因此我準備將github上面的C3D的程式碼下載下來跑一下 經過整理之後,資料夾裡面的檔案如圖  

那些我們一起誤解的REST

鼠標 devel 創建 工資 導出 地方 ade res 推導 歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐幹貨哦~ 本文由sammyshen 發表於雲+社區專欄 最近幾年REST API越來越流行,特別是隨著微服務的概念被廣泛接受和應用,很多Web Servic

那些碼農的故事3---------那些我們一起迷茫

和老師做完那個網站,對程式碼的自信心雖然增強了,但也開始懷疑自己合不合適做程式設計師。在那個無憂無慮的學生年代,早上從8點開始對著程式碼敲到晚上11點,別人在花前月下,在看碟片,在聽名人演講,在CS,在傳奇,在卡丁車,在對付最後一波來襲的殭屍,而我在對著枯燥的物件,控制元件

那些我們一起追的Code......

      2個月的工作,的確讓我學會了不少知識,從技術到架構、專案管理、溝通技巧,甚至工作中人際關係的處理,也是從那時候開始學的。那兩個月,也是一直處於高強度的工作任務中,漸漸地,我就養成了熬夜的習慣,直到現在,我還保持著2點多才休息的壞習慣。2個月夜以繼日地工作,也讓我的身體熬到了極限,再加上我想回學

程式設計師Mybatis你嗎?

摘自:https://yq.aliyun.com/roundtable/49835?&utm_campaign=sys&utm_medium=market&utm_source=edm_email&msctype=email&msca

那些我們一起寫的單例模式

題記度娘上對設計模式(Design pattern)的定義是:“一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。”它由著名的“四人幫”,又稱 GOF (即 Gang of Four),在《設計模式》(《Design Patterns: Ele

那些我們一起追的女孩~~

  昨天熬到2點,把這部電影看完了,挺有感觸的,比較驚訝臺灣的中學生活和我們大陸的中學生活是如此相近(班級人數,課桌安排,還有那個可能月經不調的英語老師的歇斯底里),感覺就發生在自己身邊一樣。   當年我們班的班花也是學習非常棒,有幾個同學比較迷她,包括我的一個好哥們(不過

Django

平臺:win10 工具:cmd python3 剛剛學習Django搭建環境,網站還木有釋出,就直接來了個大麻煩。 一切按著《Django 學習筆記(二)》這篇文章來的,在最後cmd執行伺服器(manage runserver 或者python manage.py runserver)的時候出錯了,具體程式碼

Android整合極光推送和

轉載請標明出處 整合步驟以及整合過程遇到的坑: 這部分主要闡述了整合極光推送的sdk的步驟,以及我在整合過程中遇到的一些問題。整合步驟只是摘出了極光SDK中必須的骨子的部分,可以滿足一般專案Push需求,這裡只做了通知訊息,自定義的穿透訊息請詳見極光的SDK整合文件

翅膀讓Excel飛起來——xlwings

圖片 pos 取數據 數組 並保存 () 讀取 pda 取數 python操作Excel的模塊,網上提到的模塊大致有:xlwings、xlrd、xlwt、openpyxl、pyxll等,他們提供的功能歸納起來有兩種:一、用python讀寫Excel文件,實際上就是讀寫有

微信小程式前端開發

之前由於不瞭解微信小程式的整個的執行開發機制,走了很多的彎路,腦子靈光的可能不會遇到,這個主題系列的帖子希望可以幫助到像我一樣理解能力慢的孩子。 不論是開發微信小程式還是說學習任何一門程式語言,最重要的一點是要夯實基礎,不是隻是去看看概念,從hello word開始就要好好的去對待每一行程式碼,軟工是工科,

boost log -- 使用心得和碰到的那些

最近研究了一下boost::log這個庫,記錄一下心路歷程 我的需求是log功能儘可能的不消耗程式時間,列印到stdout, log需要提供如下資訊:時間,執行緒ID,程序名字,日誌等級,檔案及行號 我的測試環境 boost 1.67 gcc version

Android 電子簽名手寫簽名案列實現方法傳網頁顯示base64

最近說專案可能會用到一個電子簽名,不需要識別的那種,只是一個單純手寫簽名,然後以base64的格式提供給前端web頁面。其實挺簡單的,自定義一個手寫view就上線了。Android 電子簽名,手寫簽名案列實現方法! 先上圖: 按鈕說明:第一個按鈕是清除手寫板,第二個是將手寫板的