nodejsでexpress を使ってAPIのモックサーバを動かすためのサンプルコード
前提条件
expressとuuidがインストールされていること
インストールされていない場合は、以下のコマンドでインストールする。
npm install express
npm instal uuid
仕様
リクエストごとにIDを発番し、それをログに出力する。
ログはリクエストの開始時と終了時に出力する。
リクエストのヘッダーとボディを出力する。
ソースコード
const express = require('express');
const { v4: uuidv4 } = require('uuid');
const app = express();
const crypto = require('crypto');
// 乱数で待ち時間を取得
function generateWaitTime() {
const buffer = crypto.randomBytes(4);
return buffer.readUInt32LE() % 10000;
}
// ミドルウェアの設定
// addRawBodyを書いているので不要
//app.use(express.json()); // JSONリクエストのパース
// リクエストIDを生成する関数
function generateRequestId(req, res, next) {
req.id = uuidv4();
next();
}
function getNow() {
const now = new Date();
const jstTime = new Intl.DateTimeFormat('ja-JP', {
timeZone: 'Asia/Tokyo',
hour12: false,
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
}).format(now);
return jstTime;
}
// rawBodyプロパティを追加する関数
function addRawBody(req, res, next) {
let data = '';
req.on('data', chunk => {
data += chunk;
});
req.on('end', () => {
req.rawBody = data;
next();
});
}
// リクエストのログ出力用のミドルウェア
app.use(generateRequestId);
app.use(addRawBody);
app.use((req, res, next) => {
const startTime = Date.now();
console.log(`[${getNow()}] [${req.id}] ${req.method} ${req.path}`);
// console.log(`Request headers:\n${JSON.stringify(req.headers, null, 2)}`);
// console.log(`Request body:\n${req.rawBody}`);
res.on('finish', () => {
const endTime = Date.now();
console.log(`[${getNow()}] [${req.id}] Response status: ${res.statusCode} Elapsed time: ${endTime - startTime}ms`);
});
next();
});
// POSTメソッドのルートエンドポイント
app.post('/*', (req, res) => {
// res.json({ message: 'POST OK' });
res.header('Content-Type', 'multipart/mixed; boundary="eGu8AIxX"');
res.send(`-----------\ntest response\n日時:${getNow()}\nID:${req.id}\n---------------------\n`);
});
// GETメソッドのルートエンドポイント
app.get('/', (req, res) => {
res.json({ message: 'GET OK' });
});
// GETメソッド waitする場合
app.get('/wait', (req, res) => {
const waittime = generateWaitTime();
setTimeout(() => {
const endTime = Date.now();
console.log(`[${getNow()}] [${req.id}] Wait Time:${waittime}ms.`);
res.json({ message: `Waited for ${waittime/1000} seconds.` });
}, waittime);
});
// レスポンスコードを変える場合
app.get('/501', (req, res) => {
res.status(501).send('Not found');
});
// サーバーの起動
app.listen(3000, () => console.log('Server listening on port 3000'));