Expressでのレスポンス.jsonとres.endとres.send()

5791 ワード

今日はあるrestful APIに対してテストを行いましたが、同時に性能が悪いことが分かりました。スループット率が非常に悪いです。その結果、res.endの誤用が判明しました。
参考:express公式文書http://www.expressjs.com.cn/4x/api.html#res
express応答には、一般的な3つのAPIが使われています。
  • ress.send()
  • res.json()
  • res.end()
  • 環境
    テスト環境:express 4.1テストツール:mocha+supertest
    1 res.send([body])
    HTTP応答を送信します。このbodyパラメータは、Bufferオブジェクト、Stringオブジェクト、またはArayであってもよい。
    Sample:
    res.send(new Buffer('whoop'));
    res.send({ some: 'json' });
    res.send('

    some html

    '
    ); res.status(404).send('Sorry, we cannot find that!'); res.status(500).send({ error: 'something blew up' });
    3つの異なるパラメータexpress応答時に異なる挙動
    1.1パラメータがブザーオブジェクトである場合
    この方法は、Content-Typeレスポンスヘッダフィールドを「aplication/octet stream」に設定します。Conteet-Typeを「text/html」に設定するには、下記のコードを使って設定します。
    res.set('Content-Type', 'text/html');
    res.send(new Buffer('some html'));
    1.2パラメータがStringである場合
    この方法はheaderのContent-Typeを「text/html」に設定する。
    res.send('some html');
    1.3パラメータがArayorまたはObjectである場合
    ExpressはJSONで応答して、この方法はheaderのContee-Typeを「text/html」として設定します。
    Res.status(500).json({});
    res.json([body])     json   
    1.4実際テスト
    sample:
    res.send({hello:"word"});
    header: 'content-type': 'application/json'
    body:{ hello: 'word' }
    
    res.send(["hello","word"]);
    header: 'content-type': 'application/json'
    body:[ 'hello', 'word' ]
    
    res.send(helloword);
    header: 'text/html; charset=utf-8'body:helldworld
    body:helldworld(postman       )
    
     res.send(new Buffer('helloworld'));
    header:'application/octet-stream'
    body:68 65 6c 6c 6f 77 6f 72 6c 64>
    2 res.json([body])
    JSON応答を送信します。この方法は、パラメータとしてオブジェクトまたは配列を同じである。つまり、res.json()は、res.send(body)の第三の場合です。同じ「content-type」:「aplication/json」。
    しかし、他の値はnullやundefinedなどJSONに変換できます。(これらの技術は無効ですが、JSON)。実際にこの条件をテストする場合のres.bodyはnullです。直接stringを送ります。bodyはstringです。
    2.1実際テスト
    Sample:
    res.json(null)
    res.json({ user: 'tobi' })
    res.status(500).json({ error: 'message' })
    
    res.json(["hello","word"]);
    header: 'content-type': 'application/json'
    body:[ 'hello', 'word' ]
    
    res.json({hello:"word"});
    header: 'content-type': 'application/json'
    body:{ hello: 'word' }
    
    res.json('helloworld');
    header: 'content-type': 'application/json'
    body:helloworld
    
    res.json(new buffer('helloworld'));
    express  
    3 res.end([data][,encoding])
    応答プロセスを終了します。この方法は実際にNodeコアから来ています。特にhttp.ServerResonseのreponse.end()方法です。迅速に終了するためには、データの応答がありません。データを使って応答する必要があれば、res.send()やres.json()などの方法を使ってください。
    res.end();
    res.status(404).end();
    3.1実際テスト
    Sample:
    res.end('helloworld');
    helloworld
    postman:helloworld
    supertest  :   
    4まとめ
    レスポンスはJSON応答を送信します。レスポンスはデータを送信します。レスポンスはres.send()を使いますが、header‘content-type’パラメータに注意してください。レスポンスは非常に性能に影響します。