expressをやってみる
expressはnode.jsをいい感じに使えるようにしてくれるフレームワークです。
https://expressjs.com/ja/
hello world
expressはnodeのコアモジュールを拡張しているので、httpモジュールのように書ける。
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.writeHead(200)
res.write('Hello,World')
res.end()
})
app.listen(3001)
express独自のメソッドを使用して実装するならば、下記。
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(ターミナル上)で表示してくれる。
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.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
で使用する。
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