ぽっぺんしゃんにょろりんこ

匿名・非追跡型アダルト動画検索エンジンの設計ノート

Node.jsのCLI引数を活用し、開発・本番を分岐するテストモードを実装!本番DBを汚すことなく動作確認をする話

こんにちは、にょろりんこの備忘録的ブログです。

今回は、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歳未満の方はご利用できません。)

sae-porns.org