[Node]Expressのres.send()とres.json()

14825 ワード


ユーザーのHTTPリクエストに答える際に、res.send()とres.json()の違いは何ですか?
app.get('/test', (req, res) => {
   // do something...
})

res.send()


res.send()メソッドを使用すると、パラメータで送信されたデータ型に基づいてコンテンツタイプを指定できます.コンテンツタイプを別途指定する必要はありません.
e.g. Buffer, String, an Object and an Array
//    res.send(Buffer.from('wahoo'));
//    res.send({ some: 'json' });
//    res.send('<p>some html</p>');
stringタイプを例とすると、実際のexpressライブラリの内部コードはContent-Typeを指定します.
res.send = function send(body) {
  var chunk = body;
  var encoding;
  var req = this.req;
  var type;

  // 생략...
  switch (typeof chunk) {
    // string defaulting to html
    case 'string':
      if (!this.get('Content-Type')) {
        this.type('html');
      }
      break;
    case 'boolean':
    case 'number':
    case 'object':
      if (chunk === null) {
        chunk = '';
      } else if (Buffer.isBuffer(chunk)) {
        if (!this.get('Content-Type')) {
          this.type('bin');
        }
      } else {
        return this.json(chunk);
      }
      break;
  }
  
  if (typeof chunk === 'string') {
      encoding = 'utf8';
      type = this.get('Content-Type');

      // reflect this in content-type
      if (typeof type === 'string') {
        this.set('Content-Type', setCharset(type, 'utf-8'));
      }
   }
	
  return this;
};

res.json()


expressライブラリの内部コードから見ると、res.json()メソッドは最後にres.send()を呼び出す.
したがって,json形式でデータを送信する場合は,意図を示すjson()メソッドを用いることが望ましいと考えられる.
(スペースなどの他のオプションも指定できます.)
res.json = function json(obj) {
  var val = obj;

  // allow status / body
  if (arguments.length === 2) {
    // res.json(body, status) backwards compat
    if (typeof arguments[1] === 'number') {
      deprecate('res.json(obj, status): Use res.status(status).json(obj) instead');
      this.statusCode = arguments[1];
    } else {
      deprecate('res.json(status, obj): Use res.status(status).json(obj) instead');
      this.statusCode = arguments[0];
      val = arguments[1];
    }
  }

  // settings
  var app = this.app;
  var escape = app.get('json escape')
  var replacer = app.get('json replacer');
  var spaces = app.get('json spaces');
  var body = stringify(val, replacer, spaces, escape)

  // content-type
  if (!this.get('Content-Type')) {
    this.set('Content-Type', 'application/json');
  }

  return this.send(body);
};

Reference

  • https://github.com/expressjs/express/blob/f275e87dff1aaef86080e6931888de4968585fd8/lib/response.js