schedule2019-07-26

【Nodejs】Expressでjsonのリクエストを受け取る

Node.jsのExpressで立てたサーバでjsonのリクエストを受け取る方法についてです。

環境構築と簡単な動作確認については公式【Nodejs】さくっとjsonを返すローカルサーバを立てる をご参照ください。

環境

モジュール

  • Express 4.17
  • body-parcer 1.19

開発環境

  • Node.js 10.15
  • npm 6.4
  • yarn 1.15
  • Windows 10 Home (Mac, Linux可)

body-parcer

Express単体でリクエストボディを取得しようとするとundefinedとなります。

app.post("/user", (req, res, next) => {
    // bodyを表示
    condole.log(req.body) // undefined
});

そのため、ボディを変換するミドルウェアのbody-parcerを使って変換が必要です。 インストールと利用方法は以下です。

# インストール
$ npm install body-parser
# or
$ yarn add body-parser
const express = require('express')
var bodyParser = require('body-parser');
const app = express()

// リクエストボディをjsonに変換する
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

これでreq.bodyでリクエストボディのJSONを取り扱えます。

コード例

例としてユーザを作成するエンドポイントを考えます。 ユーザ情報のjsonをPOSTで受け取ります。

const express = require('express')
var bodyParser = require('body-parser');
const app = express()
const port = 3000

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.post("/user", (req, res, next) => {
    // アクセスログ
    console.log(req.method, req.url, req.ip)

    // headerを表示
    console.log(req.headers)

    // bodyを表示
    console.log(req.body)

    // 登録処理など...

    res.send('OK')
});

// ポート3000でサーバ起動
app.listen(port, () => console.log(`click http://localhost:${port}/ !`))

これに{ name: 'Alice', age: 20 }をリクエストすると以下のコンソールログです。JSONのキーもreq.body.namereq.body.ageと簡単に得られます。

>node file_list.js
click http://localhost:3000/ !
POST /user ::ffff:127.0.0.1
{ host: 'localhost:3000',
  'content-type': 'application/json',
  'content-length': '37' }
{ name: 'Alice', age: 20 }

参考

参考と言いつつコアな部分はこの記事と同じになってます。すみません。