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

來源:互聯網
上載者:User

    自己寫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 = new Buffer(jsonstr);asyncfun(d, function(err, data) {  console.log(err);  throw new Error('new Error');});

    運行結果:

null[Error: new Error]

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

 

       2. buffer

      還是老規矩,先看代碼:

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

    這段代碼在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得優勢就在於非同步,硬生生要做成同步絕對吃力不討好

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.