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'));

いいなと思ったら応援しよう!