2016-04-22 5 views
1

私はノードjを初めて使い、1週間前に学習を始めました。node.jsの新しいTypeError(最初の引数は文字列またはバッファでなければなりません)

私は以下のエラーまし小規模サーバー作成中:

_http_outgoing.js:543 スロー新しいTypeError例外を(「最初の引数は、文字列やバッファでなければなりませんが」); ^

例外TypeError:最初の引数はServerResponse.OutgoingMessage.endで文字列またはバッファ でなければなりません(_http_outgoing.js:543:11)call_backfunctionで (/ユーザ/アマン/ドキュメント/学ぶ/ノード/ APP3 /サーバー.js:36:8)イテレータの (/Users/Aman/Documents/learn/node/app3/server.js:57:6) /Users/Aman/Documents/learn/node/app3/server.js :68:6 FSReqWrap.oncompleteで(fs.js:82:15)

function loadAlbums(req, res){ 
    var call_backfunction = function(err, album_list){ 
     if(err){ 
      res.writeHead(503, {"Content-Type": "text/plain"}); 
      res.end("There are no albums in folder. " + err + "\n"); 
     } 
     else{ 
      res.writeHead(200, {"Content-Type": "text/json"}); 
      res.end(album_list); 
     } 
    } 

    albumLoader(req, res, call_backfunction); 
} 


function albumLoader(req, res, callback){ 
    var path = req.core_url.pathname.substr(1, 6); 
    fs.readdir(path, function(err, files){ 
     if(err){ 
      callback(err); 
      return; 
     } 
     else{ 
      var dirs = []; 
      (function iterator(i) { 
       console.log(dirs); 
       if(i>=files.length){ 
        callback(null, dirs); 
        return; 
       } 
       fs.stat(path + "/" + files[i], function(err, stat){ 
        if(err){ 
         callback(err); 
         return; 
        } 
        else if(stat.isDirectory){ 
         dirs.push(files[i]); 
        } 
        iterator(i+1); 
       }); 
      })(0);   
     } 
    }); 
} 

その私が変更されたときに正常に動作するコールバックパラメータに

callback(null, dirs.toString()); 

私は実際にここでロジックを理解できませんでした。文字列やバッファが必要なのはなぜですか?

+0

ここではres.write()は文字列またはバッファパラメータのみを取る赤ですが、res.end()の場合もそうですか? – Aman

答えて

3

res.end(data)(データ引数が指定されている)は、res.write()およびres.end()と同じです。 res.write()は引数として文字列またはバッファのみを受け入れます。続きを読むhere

このコードを実行すると、album_listは配列です。

res.end(album_list); 

dirs配列と、結果としてalbum_list引数をバッファまたは文字列に変換すると、このエラーは発生しません。

レスポンスボディのデフォルトエンコーディングはutf8文字エンコーディングであるため、これは文字列またはバッファである必要があります。

+0

ありがとう、これは私の問題を解決しました。 以下の段落を共有してもらうことができます。 初めてresponse.write()が呼び出されると、バッファリングされたヘッダー情報と最初の本文がクライアントに送信されます。 2回目のresponse.write()が呼び出されると、Node.jsはデータをストリーミングすると仮定し、それを別々に送信します。つまり、レスポンスはボディの最初のチャンクまでバッファリングされます。 – Aman

+0

私はそれが助けてうれしいです。 res.end()を呼び出す前にres.write()を何度も呼び出してレスポンスボディを作成することができます。私はこのことが内部的にどのように働くのか分かりません。 – piscator