1. 程式人生 > >Express中 res.json 和res.end 及res.send()

Express中 res.json 和res.end 及res.send()

今天對某個restful API 進行測試過程發現併發效能很差,吞吐率差了非常多。結果發現是res.end 誤用的情況。

現在總結下 express響應中用到常用三種API:

res.send() res.json() res.end()

環境

測試環境:express 4.14.1 測試工具:mocha + supertest

1 res.send([body])

傳送HTTP響應。 該body引數可以是一個Buffer物件,一個String物件或一個Array。

Sample:

res.send(new Buffer('whoop'));
res.send({ some: 'json' });
res.send('<p>some html</p>');
res.status(404).send('Sorry, we cannot find that!');
res.status(500).send({ error: 'something blew up' });12345

三種不同引數 express 響應時不同行為

1.1 當引數是buffer物件

該方法將Content-Type 響應頭欄位設定為“application / octet-stream” 如果想Content-Type設定為“text / html”,需使用下列程式碼進行設定

res.set('Content-Type', 'text/html');
res.send(new Buffer('<p>some html</p>'));12

1.2 當引數是是String

該方法設定header 中Content-Type為“text / html”:

res.send('<p>some html</p>');1

1.3 當引數是Arrayor 或 Object

Express以JSON表示響應,該方法設定header 中Content-Type為“text / html”

Res.status(500).json({});
res.json([body]) 傳送一個json的響應12

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:<Buffer 68 65 6c 6c 6f 77 6f 72 6c 64>123456789101112131415

2 res.json([body])

傳送JSON響應。 該方法res.send()與將物件或陣列作為引數相同。 即res.json()就是 res.send([body])第三種情況。同樣 ‘content-type’: ‘application/json’。

但是,您可以使用它將其他值轉換為JSON,例如null和undefined。(儘管這些技術上無效的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報錯123456789101112131415161718

3 res.end([data] [,encoding])

結束響應過程。這個方法實際上來自Node核心,特別是http.ServerResponse的response.end()方法。 用於快速結束沒有任何資料的響應。 如果您需要使用資料進行響應,請使用res.send()和res.json()等方法。

res.end();
res.status(404).end();12

3.1實際測試

Sample:

res.end('helloworld');
helloworld
postman:helloworld
supertest測試:無內容

4 總結

用於快速結束沒有任何資料的響應,使用res.end()。 響應中要傳送JSON響應,使用res.json()。 響應中要傳送資料,使用res.send() ,但要注意header ‘content-type’引數。 如果使用res.end()返回資料非常影響效能。