とあるWeb屋の備忘録

とあるWeb屋の備忘録。たまに雑記。

Node.jsを触ってみた話4

Node.jsを触ってみた話4

Node.jsを触ってみた話3の続き。

前回やったこと
・ルーティングとミドルウェアについて
ルーターモジュールを使ったルーティングの方法と使わない方法の比較

今回は前回やったことにプラスして、ミドルウェアの処理を複数実行する方法を書くよ!
前回のおさらいとして2つのソースを以下に挙げときます。

ルーターモジュール使わない方法

var express = require('express');
var app = express();

app.get('/', (req, res) => {
    res.send('Hello world!!!');
});

ルーターモジュールを使う方法

まずはモジュール化

//hoge.js
var express = require('express');
var router = express.Router();

router.get('/', (req, res) => {
    res.send("Hello world!!!");
})

module.exports = router; //ルーティングを設定したrouterオブジェクトを返す

アプリケーションにマウント

//app.js
var express = require('express');
var app = exporess();

var hogeRouter = require('./hoge');

app.use('/', hogeRouter);


ミドルウェアに処理を渡す方法

ミドルウェアに複数の処理を実行させるにはnext();を使う!
next()関数は次のミドルウェア関数に対するアクセス権限を持つ関数!
nextの名前は変更できるが慣習的に使われているので変えない!

以下ソース例
モジュール利用時のミドルウェア関数に第三引数としてnext()を与えます。
そして処理を一つ増やして、next()で処理を渡してあげます。

//hoge.js
var express = require('express');
var router = express.Router();

router.get('/', (req, res, next) => {
    res.send("Hello world!!!");
    next();
}, function(req, res) {
    console.log("test message!");
});

module.exports = router;

これでページに"Hello world"が出力されてからコンソール画面に"test message"が出力されます! ただ疑問点があって、イベントループ的にこれは"Hello world"が先なのか"test message"が先なのか  ちょっと混乱してきた。。。

実際next()はミドルウェア関数のコールバックとして渡されるはずだけど、ノンブロッキングってことになるからもしかしてページに"Hello world"が表示されるよりも先に"test message"が出るのかな。。。?
わかる人いたら教えてください!!!!!!

次回はgetとpostの処理を書いていきたいと思います。
Node初心者が書いているため間違いや指摘などあれば大歓迎です!よろしくお願いします!!!