5
4

More than 3 years have passed since last update.

Express事始め

Posted at

expressをやってみる

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

hello world

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

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独自のメソッドを使用して実装するならば、下記。

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を作成する。

・通常の処理

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

・エラー処理

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

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

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

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!

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

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

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

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

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

const router = express.Router()

実際の使用例

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で使用する。

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

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4