その年、nodejsで踏んだ穴(一)

5159 ワード

自分でnodejsを書いても一時期、たくさんの穴を踏んだことがあります.他の人が踏んだ穴も見たことがあります.原因は簡単です.あるいはこの知識点に対する理解が足りないか、コード化の習慣がよくないです.このごろは友達の春の大牛の呼びかけにこたえて、これらの穴を次々と整理していくつもりです.自分のために忘れないようにします.
    1.calback
    イベントのフィードバックはnodejsのよくあるアプリケーションシーンです.まず、以下のコードに何か問題があるかどうか見てみましょう.
get(params, function(err, data) {
  if (err) {
    callback(err);
  }
  // data    
  var row = data[0];
});
     わかったでしょう.はい、errが存在する場合は、calbackの後、次のコードを実行します.この時、dataの値は何ですか?私達はよくコントロールできません.ダタがこの時に戻ってきたのがundefinedだったら、悲劇です.プログラムは間違いです.もちろん解決方法は簡単です.コールバックの前に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);
  }
});
     何の問題もないようですね.へへへ、答えを発表します.はい、二回も転調されました.calback(null,Errer)は一回、calback(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.ブザー
      まだ慣例です.コードを先に見ます.
var data = "";  
res.on('data', function (chunk) {  
  data += chunk;  
})  
.on("end", function () {  
  // data    
}); 
    このコードはchunkではasciiコードかデータ量が少ない時は大丈夫ですが、もしあなたのデータが大量の中国語だったら、おめでとうございます.その理由は二つのchunkのつなぎ合わせが正常ではなく、バーフィー.toString()+バーフィー.toString()が行われたことに相当します.ブザーが完全でないと、stringが出てきた後の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://www.cnblogs.com/lengyuhong/archive/2012/05/31/2527016.html