expressをやってみる
expressはnode.jsをいい感じに使えるようにしてくれるフレームワークです。
https://expressjs.com/ja/
hello world
expressはnodeのコアモジュールを拡張しているので、httpモジュールのように書ける。
constexpress=require('express')constapp=express()app.get('/',(req,res)=>{res.writeHead(200)res.write('Hello,World')res.end()})app.listen(3001)
express独自のメソッドを使用して実装するならば、下記。
constexpress=require('express')constapp=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メソッドを使用する。
constexpress=require('express')constapp=expresss()app.use((req,res,next)=>{})app.listen(3001)
実際に使ってみた例が下記。アクセスしたユーザーエージェントをconsole.log(ターミナル上)で表示してくれる。
constmiddlewear=require('./module')constexpress=require('express')constapp=express()app.use(middlewear)app.get('/',(req,res)=>{res.status(200).send('Hello, World')})app.listen(3001)
module.exports=function(req,res,next){constua=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と表示される。
constexpress=require('express')constapp=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
ルーティングのモジュール化
ある程度のアプリの規模になるとルーティングが肥大化するため、モジュール化する。
constrouter=express.Router()
実際の使用例
constrouter=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
で使用する。
constexpress=require('express')constapp=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