はじめに
Node.jsのExpressの雛形を生成するコマンド
express project-name
で出力されるコードの一部ですが
varexpress=require('express');varrouter=express.Router();router.get('/',function(req,res,next){res.render('index',{title:'Express',user:req.user});});
このreq
, res
, next
は何なのか書いていこうと思います。
reqについて
req
はapp.get
の第一引数で指定されたパスに入ってきたHTTPリクエストを表すオブジェクトです。
varexpress=require('express');varapp=express();app.get('/',func);functionfunc(req,res){console.log(req.ip);console.log(req.method);console.log(req.path);console.log(req.protocol);console.log(req.query.name)res.end();}
req
はapp.get
の第一引数で指定されたパスに入ってきたHTTPリクエストを表すオブジェクトです。
サーバを起動し(Portは8000)、
curl -X GET localhost:8000/hoge\?name=user1
::ffff:127.0.0.1
GET
/hoge
http
user1
とリクエストを送って出力を見てみましょう。ちなみにapp.get
はGETメソッドでリクエストを受け付けます。最後のres.end()
はHTTPレスポンスのプロセスを終了する関数です。これがないと処理が正常に完了しません。
このように来たHTTPリクエストに関する様々な情報を取得することができます。reqのプロパティやメソッドは他にもまだまだありますので詳しくは、
https://expressjs.com/ja/4x/api.html#req
を見てください。
resについて
res
は指定されたパスに入ってきたリクエストに対するHTTPレスポンスを構成するためのオブジェクトです。
varexpress=require('express');varapp=express();app.get('/',func);functionfunc(req,res){if(req.query.name){res.status(200).send('Hello! your name :'+req.query.name);}else{res.status(400).send('Who are you?');}}
サーバを立てて、
curl -X GET localhost:8000/hoge\?name=user1
> Hello! your name : user1
curl -X GET localhost:8000/hoge
> Who Are you?
とするとHTTPレスポンスが帰ってきます。status()
でステータスコードを設定でき、send()
でレスポンスボディを設定できます。send()
にはHTTPレスポンスプロセスの終了処理が含まれるので、end()
は不要です。
resのプロパティやメソッドは、https://expressjs.com/ja/4x/api.html#res
を参考にしてください。
nextについて
通常は上記の、app.get('/hoge', func);
のように、あるpath(/hoge
)に対する、手続き(func
)を呼んで、その中で、HTTPレスポンスを返して(res.end()
)終了します。
次のコードを見てください。
app.get('/hoge',preProcess1,preProcess2,mainProcess);functionpreProcess1(req,res,next){console.log('1個目の前処理したよ!');}functionpreProcess2(req,res,next){console.log('2個目の前処理したよ!');}functionmainProcess(req,res){res.send('メインの処理をしたよ!');}
実はこのように/hoge
に対するアクションを何個も登録することができます。
まずはこれにリクエストを送ってみましょう。
curl -X GET localhost:8000/hoge
%% server 側
1個目の処理をしたよ!
このようにpreProcess1の1個のみが実行されて、他は実行されませんでした。
preProcess1->preProcess2->mainProcessと処理を継続させたい時に使用するのがnextです。
app.get('/hoge',preProcess1,preProcess2,mainProcess);functionpreProcess1(req,res,next){console.log('1個目の前処理したよ!');next();}functionpreProcess2(req,res,next){console.log('2個目の前処理したよ!');next();}functionmainProcess(req,res){res.send('メインの処理をしたよ!');}
この場合、
curl -X GET localhost:8000/hoge
メインの処理をしたよ!
%% server 側
1個目の処理をしたよ!
2個目の処理をしたよ!
と出力され、無事にHTTPレスポンスを返して処理を終えることができました。
next()関数によって、次の処理へ制御を渡すことができます。
https://expressjs.com/ja/guide/writing-middleware.html
ここによると、この場合の関数preProcess1やpreProcess2はmainProcessを行うための中間的な役割を行うものとして「ミドルウェア」と命名されています。
もしかしたらmainProcessも定義的にはミドルウェアかもしれないけど個人的にちょっと違和感があります。。。
参考文献
https://expressjs.com/ja/4x/api.html#req
https://expressjs.com/ja/4x/api.html#res
https://expressjs.com/ja/guide/writing-middleware.html