こんにちは、にょろりんこの備忘録的ブログです。
今回は、Node.jsのCLI引数を活用し、開発・本番を分岐するテストモードを実装。本番DBを汚すことなく動作確認をするというお話をしていきます。
みなさん、こんな経験ありませんか?
- スクリプトを試したいけど、本番DBのデータを壊したくない。
- 1件だけテストしたいのに、ループ処理が全部走ってしまう。
- テスト用DBを別に用意したけど、本番の挙動と微妙に違ってハマる。
そんなとき便利なのが、「テストモードの分岐処理」です。
Node.jsでは、コマンドライン引数(CLI引数)を使って、「URLを手動指定されたときだけ1件テスト実行する」処理に簡単に分岐できます。
ポイントは、ID=0の特別なレコードを使えば、本番DBにあっても、ほとんど影響を出さずに安全にテストできるというところです。
今回は、その実装方法と活用のコツを丁寧に解説していきます。
それでは、いってみましょう!

ID=0を活用して、本番DBでテストモードを実装する
Sae-Porns のスクリプト群では、動画URLを1件ずつ解析する処理が基本です。
しかし、コードをアップデートしたりバグを修正したりした際、本番環境で本当に動くかどうかを試すと思うのですが、うっかり本番実行してしまうとコードが一気に走り出してしまい大変なことになります。
そのため、ここで活躍をするのがID=0による、本番環境テストモードです。
実際のコードとしては以下になります。
// コマンドライン引数から URL を取得
const inputUrl = process.argv[2];// ────────────────────────────────
// テストモード分岐:CLI引数にURLが指定されていた場合
// 本番ループをスキップして、ID=0 のレコードとして1件のみ処理します
// ────────────────────────────────
if (inputUrl && /^https?:\/\//.test(inputUrl)) {
const page = await browser.newPage();// プロキシ認証が必要な場合の認証情報を設定
await page.authenticate({ username: proxyUser, password: proxyPass });// ID=0 を指定して、1件のテスト用URLを解析(本番DBを使っても安全)
await analyzeWithTimeout({ page, browser, pool, id: 0, url: inputUrl });// ページを閉じる(リソース解放)
await page.close();// ────────────────────────────────
// 通常モード:URL引数がない場合は、DBから未処理(analyzed=0)のURLを順次取得
// runLoop 関数がループ処理を担当
// ────────────────────────────────
} else {
await runLoop(pool, null, browser, async ({ browser, pool, id, url }) => {
const page = await browser.newPage();// プロキシ認証を設定
await page.authenticate({ username: proxyUser, password: proxyPass });// 通常のIDとURLで解析処理を実行
await analyzeWithTimeout({ page, browser, pool, id, url });// ページクローズ時のエラーハンドリングを追加
try {
await page.close();
} catch (e) {
console.warn(`page.close() エラー: ${e.message}`);
}
});
}
このように、CLI引数からURLを指定すると、ID=0のレコードを対象に1件だけ処理する特別モードに分岐します。
これ、ちょっとした分岐に見えますが、実はとても便利なんです。
テストモードがあると何がうれしいの?
たとえば、Node.jsで作成したスクリプトをコマンドラインから実行するとき、通常はこんなふうに実行すると思います。
node main.js
しかし前述のとおり、この書き方のままバグが残っていると、本番DBに一気にアクセスし、データを汚染してしまう危険があります。
この状況を避けるために有効なのが、URLを1本だけ渡すテストモードです。
たとえば以下のように実行します。
node main.js "https://example.com/test-video"
この書き方をすると、スクリプトは本番ループをスキップして、指定されたURLだけを、ID=0として処理するようになります。
これにより、DB内の通常データには一切手を触れず、後段の INSERT や UPDATE などの処理まで含めた、完全な通しテストが可能になります。
つまり──
- 「INSERT 処理が本当に動くか?」
- 「durationのフィルター条件は正しく判定されるか?」
などの、本番と同じ挙動を1件だけ、安全に試せるというわけです。
事前に行うDB処理
このテストモードを使うためには、id = 0 のレコードが事前にDBに存在していることが前提となります。
スクリプトの中で自動的に挿入されるわけではないため、MySQLから手動で REPLACE を実行して、テスト用レコードを仕込んでおく必要があります。
たとえば、以下のようなSQLを実行します:
REPLACE INTO urls (id, url, analyzed) VALUES (0, 'https://example.com/test-video', 0);
このようにしておくことで、node main.js "https://example.com/test-video" のように実行した際に、ID=0のレコードとして安全に1件だけ処理されるようになります。
Sae-Pornsの実装ではVideoページのクローリングを想定していますが、本質的には、DB操作を含むあらゆるコードで有効な汎用的テクニックです。
「CLI引数で URL や ID を渡す」→「通常ループと分岐」→「テスト時だけ特定レコードで処理を固定」という王道のロジック。
地味ですが、「本番ロジックを1件だけ通してみたい」ときに圧倒的に便利です。こうした小さな技術の積み重ねが、Sae-Porns を支えています。
それでは皆さま、よき開発ライフを。
※このコードが実際に使われている「追跡されないアダルト動画の検索エンジンSae-Porns」はこちら!よかったら見ていってください。(18歳未満の方はご利用できません。)