Express事始め


# expressをやってみる

expressはnode.jsをいい感じに使えるようにしてくれるフレームワークです。
[https://expressjs.com/ja/](本番)


## hello world
expressはnodeのコアモジュールを拡張しているので、httpモジュールのように書ける。

```js:app.js
const express = require('express')
const app = express()

app.get('/', (req, res) => {
  res.writeHead(200)
  res.write('Hello,World')
  res.end()
})
app.listen(3001)
```

express独自のメソッドを使用して実装するならば、下記。

```js:app.js
const express = require('express')
const app = express()

app.get('/', (req, res) => {
  res.status(200).send('Hello, world')
})
app.listen(3001)

```
上記でlocalhost:3001にアクセスできる。
完結!

ちなみにhttpモジュールではGET/POSTどちらも受け付けていたが、
上記の実装だとGETのみ受け付ける。(後ほど詳しく触れます)


## ミドルウェアを利用する

Expressは最低限の機能しか持たないため、ミドルウェアを組み込む事になる。
ミドルウェアを作成するには、下記のようなfunctionを作成する。

・通常の処理

```js
function(req, res, next) {
   // 何かしらの処理
   next()
}
```

・エラー処理

```js
function(err, req, res, next) {
   // 何かしらの処理
　　next()
}
```

next()を呼び出すことで、次の制御に移行する。

上記のミドルウェアを利用する場合は**use**メソッドを使用する。

```js
const express = require('express')
const app = expresss()

app.use((req, res, next) => {
})

app.listen(3001)
```


実際に使ってみた例が下記。アクセスしたユーザーエージェントをconsole.log(ターミナル上)で表示してくれる。

```app.js
const middlewear = require('./module')

const express = require('express')
const app = express()

app.use(middlewear)
app.get('/', (req, res) => {
  res.status(200).send('Hello, World')
})
app.listen(3001)
```

```module.js
module.exports = function(req, res, next) {
  const ua = req.headers['user-agent']
  console.log(ua)

  next()
}
```

##ルーティング

`app.メソッド(パス, コールバック)`で実装する。

メソッド　・・・　`GET,POST`などを小文字で指定する。
パス  ・・・URLのパス。正規表現での指定可
コールバック　・・・メソッドやパスが一致した場合に発動するfunctionを指定

名前付きパラメータも利用できる。コロン付きで指定すればOK!

```js
app.get('/post/:id', (req, res) => {
  console.log(req.params.id)
})
```

下記実装後、 localhost:3001/post/31にアクセスすると、　ターミナル上に31と表示される。

```js
const express = require('express')
const app = express()

app.get('/post/:id', (req, res) => {
  console.log(req.params.id)
  res.status(200).send('ok,hello')
})

app.listen(3001)
```

`/post/:id?`　というように正規表現を使う事で、
- /post/31
- /post/
- /post
などにも該当させることができる。


`/post/:id*` であれば
- /post/31
- post/31/plus

などがヒットする。

Custom Matching Parameterというものもある。

`/post/:id(\\d+)`であれば、数値のみのマッチングのため
/user/123はマッチするが、
/user/abcはヒットしない。

expressは内部で`path-to-regexp`というパッケージを使用している為、
そのドキュメントを見れば詳しいことがわかる。
https://www.npmjs.com/package/path-to-regexp

## ルーティングのモジュール化

ある程度のアプリの規模になるとルーティングが肥大化するため、モジュール化する。

```js
const router = express.Router()
```


実際の使用例

```js
const router = require('express').Router()

// ミドルウェア どのルートでも走る
router.use((req, res, next) => {
  console.log('ミドルウェアです')
  next()
})

router.get('/', (req, res) => {
   res.send('/')
   console.log('第一ルーティング')
})

router.get('/about', (req, res) => {
   res.send('/about')
   console.log('第二ルーティング')
})

module.exports = router
```

routerはミドルウェアなので、`app.use`で使用する。

```js:app.js
const express = require('express')
const app = exppress()

app.use('/user', require('./router/user.js'))
app.listen(3001)
```

`/user/`にアクセスすると　「第一ルーティング」がconsole.logに出力され、
`/user/about`にアクセスすると「第二ルーティング」がconsole.logに出力される。


【参考サイト】
https://expressjs.com/ja/
https://dev.classmethod.jp/articles/express_router_param_get/
https://qiita.com/kibinag0/items/8936476e99ed50279b83