No-as-a-Service
NaaS — ランダムな「ノー」と、その裏側のミニマル Express サーバ。
何をするサービスか
No-as-a-Service は、GET /no ひとつで JSON 形式の断り文句を返す小さな API。真面目なビジネス文面からシュールな言い訳まで、reasons.json に載った大量の短文から毎回ランダムに選ぶ。ボット・デモ・社内ツールのネタ用途向け。
1055reasons.json 行(配列要素数)
120req / 分 / IP(上限)
1公開エンドポイント
Expressランタイム
公開ホスト例: 作者のデプロイではベース
https://naas.isalman.dev/no が README に記載されている。利用条件・可用性は当該ホストのポリシーに従う。
契約
| 項目 | 値 |
|---|---|
| メソッド | GET |
| パス | /no |
| レスポンス | { "reason": "<string>" }(Content-Type: application/json 想定) |
| レート制限 | 1 分あたり 120 リクエスト / IP。超過時は { "error": "Too many requests, ..." } 形式(実装依存) |
| CORS | cors ミドルウェアで全オリジン許可(ローカル検証向け。本番では絞り込みを検討) |
リクエスト例
GET /no HTTP/1.1
Host: localhost:3000レスポンス例
{
"reason": "This feels like something Future Me would yell at Present Me for agreeing to."
}
リクエストの流れ
HTTP GET /no
→
express-rate-limit
→
メモリ上の reasons[]
→
乱数 1 件
→
res.json({ reason })
- データ読み込み: 起動時に
reasons.jsonを同期読み込みし配列を保持。リクエストごとにディスク I/O はしない。 - レート制限キー:
cf-connecting-ipヘッダがあればそれを優先し、なければreq.ip。trust proxyを有効にしてプロキシ背後の IP を扱う。 - 依存関係(ローカル clone):
express,cors,express-rate-limit(package.json準拠)。
エントリポイント(抜粋)
const express = require('express');
const cors = require("cors");
const rateLimit = require('express-rate-limit');
const fs = require('fs');
const app = express();
app.use(cors());
app.set('trust proxy', true);
const PORT = process.env.PORT || 3000;
const reasons = JSON.parse(fs.readFileSync('./reasons.json', 'utf-8'));
const limiter = rateLimit({
windowMs: 60 * 1000,
max: 120,
keyGenerator: (req, res) => {
return req.headers['cf-connecting-ip'] || req.ip;
},
message: { error: "Too many requests, please try again later. (120 reqs/min/IP)" }
});
app.use(limiter);
app.get('/no', (req, res) => {
const reason = reasons[Math.floor(Math.random() * reasons.length)];
res.json({ reason });
});
app.listen(PORT, () => {
console.log(`No-as-a-Service is running on port ${PORT}`);
});
手順
- リポジトリを clone し、ディレクトリに入る。
npm installnpm start(内部でnode index.js)- 既定では
http://localhost:3000/noが有効。
ポート: 環境変数
PORT で上書き可能(例: PORT=5000 npm start)。
コンテナ開発向けに .devcontainer.json と Dockerfile が同梱されている。ライセンスは MIT。
ソース・関連
- GitHub: hotheadhacker/no-as-a-service — 本ページの解説元(ローカル作業コピー:
repos/no-as-a-service) - 公開 API 例(README 記載のベース URL)