駆け出しのエンジニア日記

プログラミング言語勉強中の奮闘日記

自作のミドルウェアを作ってみる

簡単なものですが、自作のミドルウェアを作成してみましょう。

expressjs.com

Expressのガイドにも記載がありますが、

「 req , res 」のオブジェクト以外にも第三引数に「 next 」を渡すことができます。

この「 next 」が次のミドルウェアを指す関数となっています。

文字だけではわかりづらいので実際に記述してみます。(_の部分)

const express = require('express');
const app = express();
const morgan = require('morgan');
app.use(morgan('tiny'));
// 自作のミドルウェア
app.use*1;

// 自作のミドルウェア
app.use((req, res, next) => {
console.log('初めてのミドルウェア!!!');
//returnすることで、next()以降の処理は無視される
return next();
   console.log('初めてのミドルウェアのnextのあとの処理!!!');
});
app.use((req, res, next) => {
console.log('2個目のミドルウェア!!!');
return next();
});
app.use((req, res, next) => {
console.log('3個目のミドルウェア!!!');
return next();
});

app.get('/', (req, res) => {
console.log(`リクエスト時間:${req.requestTime}`);
res.send('ホームページ');
})
app.get('/dogs', (req, res) => {
console.log(`リクエスト時間:${req.requestTime}`);
res.send('わんわん');
})
app.listen(3000, () => {
console.log('localhost:3000で待機');
})

連続して出力されています。次の関数が続く限り、呼ばれています。

そして「 next() 」の前に「 return 」を記述することで、「 next() 」以降の処理を無視

するような意味になります。

なので「console.log('初めてのミドルウェアのnextのあとの処理!!!');」というコ

ンソールはログに表示されていません。

誤って、「 next() 」の後ろに何かしらの処理を記述し、それに気づかないと思わぬバグ

になってしまうこともあるので、「 return 」を記述することでそれを防ぐようになって

います。

*1:req, res, next) => {

console.log('初めてのミドルウェア!!!');
return next();
});
app.get('/', (req, res) => {
console.log(`リクエスト時間:${req.requestTime}`);
res.send('ホームページ');
})
app.get('/dogs', (req, res) => {
console.log(`リクエスト時間:${req.requestTime}`);
res.send('わんわん');
})
app.listen(3000, () => {
console.log('localhost:3000で待機');
})

ログで確認取れました。

app.use() 」を使うことで全てのリクエストで処理が実行されるようになっていま

す。(GETやPOST、DELETEなど)

 

また「 next() 」を記述することで次の関数を呼ぶことになるので、下記のように記述

することも可能です。

const express = require('express');
const app = express();
const morgan = require('morgan');
app.use(morgan('tiny'