2016-04-05 4 views
1

javascriptの後にいくつかのnodejを学び始めて、いくつかの単純なサーバーを作成しています。js/nodejs request.on()とquerystring.parse()を使用したPOSTメソッドの基本的な初心者サーバー

var http = require('http'); 
var url = require('url'); 
var querystring = require('querystring'); 


function onRequest(request, response) { 

    if (request.method == 'POST') { 
     var body = ''; 

     request.on('data', function (data) { 
      body += data; // data sent via http protocol will always be sent as a string and can be concatenated 
      // if body > 1e6 === 1* Math.pow(10,6) ~~~ 1MB 
      // flood attack or faulty client 
      // (code 413: request entity too large), kill request 
      if (body.length > 1e6) { 
       response.writeHead(413, {'Content-Type':'text/plain'}).end(); 
       request.connection.destroy(); 
      } 
     });   // end of data communication: body will contain all the parameters of the query 

     request.on('end',function(){ 
      var POST = querystring.parse(body); 
      // now to get the different parameters use // POST.<field name> e.g. POST.user 
      response.end('Hello, ' + POST.firstname + ' ' + POST.lastname); 

     }); 
    } 


} 

var server = http.createServer(onRequest); 

server.listen(3000); 

私はここまで理解したが、トラブル見上げるとrequest.on()とquerystring.parse()このコードの部分を理解しているしています。私は、私が混乱している正確な部分の下に、より明快に強調表示します。

1)request.on()

だから私はそのrequest.on(「データ」)はnodejsは、データのチャンクを受信するイベントのリスナーを設定する必要があります読みました。この部分上の例でそう:

request.on('data', function (data) { 
       body += data; 
       if (body.length > 1e6) { 
        response.writeHead(413, {'Content-Type':'text/plain'}).end(); 
        request.connection.destroy(); 
       } 

それは、再び最初のパラメータ「データ」を取るコールバック関数として二番目のパラメータを取っています。これは私が混乱しているものです。ここで2番目のパラメータで何をしようとしていますか?

2)request.on( '終了')とquerystring.parse()Iは、データのアップロードが完了したことrequest.on( '末端')信号のリスナーを設定nodejs有すること読み取る

ので、以下のコード:request.onインサイド

request.on('end',function(){ 
       var POST = querystring.parse(body); 
       // now to get the different parameters use // POST.<field name> e.g. POST.user 
       response.end('Hello, ' + POST.firstname + ' ' + POST.lastname); 

      } 

(「終了」)我々はPOSTandと呼ばれる新しい変数がbodyが結合されたすべてのデータの以前の変数であることをquerystring.parse(body)に等しく、それを設定してください。このquerystring.parse(body)からどうやって.firstnamePOST.firstname)を適用し、そのコンポーネントにアクセスしますか?

ありがとうございます。

+0

まだこれらの回答は誰も知りません。 – darkphoton

答えて

0

質問1 http://www2 HTTPリクエストデータストリームを処理し、後で使用するためにストリームをバッファ/ varに保存するなどのカスタム動作を行うためのコードを注入できます。

あなたは、単にオブジェクトのドット表記を使用してパラメータを照会するhttps://github.com/expressjs/body-parser

bodyparserノードモジュールを使用することができますPOSTパラメータを照会します。例:req.body.form_field_name

body-parserは、POST/PUTメソッドで渡されたデータにすばやくアクセスするのに便利なモジュールです。

Expressは、生ボディデータを隠しておき、アクセスを得るためにbody-parserに似たモジュールを使用する必要があります。これはボディコンテンツの読み取り専用コピーですのでご注意ください。

乾杯。

PSボディパーサーは、あなたの即時の必要性に対処していない場合は、

  1. github.com/stream-utils/raw-body
  2. githubのをチェックしてください。COM/moscartong /表現-rawbody
1

あなたの最初の質問について:

それは、再び最初のパラメータ「データ」を取るコールバック関数として二番目のパラメータを取っています。これは私が混乱しているものです。ここで2番目のパラメータで何をしようとしていますか?リスナー関数を定義しているので、何をここでやっている

は毎回request火災dataイベントと呼ばれます。あなたは、次のようにして、それが明確に見ることができるかもしれません:

request.on('data', onChunkReceived) 

function onChunkReceived (data) { 
    body += data 

    if body > 1e6 === 1* Math.pow(10,6) ~~~ 1MB 
    if (body.length > 1e6) { 
     response.writeHead(413, {'Content-Type':'text/plain'}).end(); 
     request.connection.destroy(); 
    } 
} 

あなたがやっていることはdataパラメータをとる関数を、定義しています。選択されたイベント名とパラメータ名が同じであるという事実であまりにも煩わされることはありません。

request.on('data', onChunkReceived) 

function onChunkReceived (chunk) { 
    body += chunk 

    if body > 1e6 === 1* Math.pow(10,6) ~~~ 1MB 
    if (body.length > 1e6) { 
     response.writeHead(413, {'Content-Type':'text/plain'}).end(); 
     request.connection.destroy(); 
    } 
} 

...まったく同じように動作します。だからもう一度:dataはイベントの名前であり、サーバーが受け取ったデータの各チャンクを受け取る関数を定義しています。あなたの上のあなたの例では、関数がインラインである匿名関数です。上のスニペットを別の名前付き関数として再フォーマットしました。あなたの2番目の質問に今

我々はPOSTandと呼ばれる新しい変数が、それは同じボディはすべての以前の変数であることを(体)querystring.parseするように設定します(「終了」)

インサイドrequest.onデータは結合されます。このquerystring.parse(body)からどうやってそれに.firstname(POST.firstname)を適用し、そのコンポーネントにアクセスするのですか?

querystring.parseメソッドは、特定の形式の文字列を受け取り、それをJavascriptオブジェクトに解析します。 Node.js docs on querystringは、私がここにいるよりはるかに優れていると説明しています。

firstname=Dan&lastname=Takahashi

を呼び出す:だから、私はあなたから作業している例では、身体が特定のフォーマットになることを期待していることを前提とすることができ、それはそれは、次の形式でだということform encoded意味です

POST = { 
    "firstname": "Dan", 
    "lastname": "Takahashi" 
} 
あなたは上記の言うようにあなたがして対処することができ

:「高橋」になります「ダン」になりPOST.firstnamePOST.lastname、その文字列のquerystring.parseは、あなたは次のようになりますオブジェクトが返されます。

+0

明快で簡潔な説明をありがとう。 2番目の部分では、 'querystring.parse(body)'は、このメソッドを変数 'body'で使用することを意味します。これはすべてのデータの合計です。つまり、 'firstname = Dan&lastname = Takahashi'のように、' POST.firstname'は最初の名前を取得できません。どのようにして受信したデータが常にこの形式になり、querystring.parse()。firstnameを呼び出すことができるのでしょうか? – darkphoton

+0

@darkphotonはい、正常に動作するには受信したデータがその形式になっている必要があります。これが意味することは、どのクライアントがPOSTを行っていても、そのデータを(アプリケーション/ x-www-form-urlencodedと呼ばれる)その形式で送る必要があるということです。これは "mimetype"と呼ばれます。クライアントがHTTP経由でデータを送信すると、「これはデータを送信する形式です」という内容のヘッダーが設定されます。実際の状況では、ヘッダーを読んで、指定したタイプを処理できるかどうかを判断し、それに応じて処理します。あなたが投稿したこの簡単な例では、それは書式を前提として作られています。 – milkandtang

+0

ありがとうございました。 – darkphoton

関連する問題