序章

cron は、特定の時間間隔でタスクを繰り返す方法を提供します。 ロギングやバックアップの実行など、毎日、毎週、または毎月実行する必要のある反復的なタスクが存在する場合があります。

Node.jsサーバーにcronを実装する1つの方法は、node-cronモジュールを使用することです。 このライブラリはcrontab構文を使用します。これは、Unixライクなオペレーティングシステムでcronを使用した経験のあるユーザーにはおなじみかもしれません。

Screenshot of a task repeatedly running every minute

この記事では、node-cronを使用して、サーバーからログファイルを定期的に削除します。 また、データベースのバックアップとスケジュールされた電子メールの送信という2つの一般的な使用例も提示されます。

前提条件

このチュートリアルを実行するには、次のものが必要です。

このチュートリアルは、ノードv17.2.0、npm v8.1.4、node-cron v2.0.3、shelljs v0.8.4、およびnodemailerv6.7.2で検証されました。 。

ステップ1—ノードアプリケーションの作成と依存関係のインストール

開始するには、ターミナルを開き、プロジェクト用の新しいフォルダを作成して、新しいノードアプリケーションを作成します。

  1. mkdir node-cron-example

次に、新しいプロジェクトディレクトリに移動します。

  1. cd node-cron-example

次に、それを初期化します。これにより、依存関係の追跡に使用するpackage.jsonファイルが作成されます。

  1. npm init --yes

次のコマンドを実行して、node-cronモジュールを追加します。

  1. npm install node-cron@3.0.0

node-cronモジュールはタスクスケジューラです。

プロジェクトの依存関係がインストールされます。 サーバーを構築しましょう。

ステップ2—タスクのスケジュール

これで、サーバーを構築し、node-cronを使用して、1分ごとに実行するタスクをスケジュールできます。

新しいcron-ping.jsファイルを作成します。

  1. nano cron-ping.js

次に、node-cronを要求します。

cron-ping.js
const cron = require('node-cron');

次に、次のコード行をcron-ping.jsに追加します。

cron-ping.js
// ...

// Schedule tasks to be run on the server.
cron.schedule('* * * * *', function() {
  console.log('running a task every minute');
});

これらのアスタリスクは、さまざまな時間単位を表すcrontab構文の一部です。

  * * * * * *
  | | | | | |
  | | | | | day of week
  | | | | month
  | | | day of month
  | | hour
  | minute
  second ( optional )

1つのアスタリスクはワイルドカードのように動作します。 つまり、タスクはその時間単位のすべてのインスタンスに対して実行されます。 5つのアスタリスク('* * * * *')は、毎分実行されるcrontabのデフォルトを表します。

アスタリスクの代わりの数値は、その時間単位の値として扱われます。 タスクを毎日および毎週、またはより複雑に実行するようにスケジュールできます。

注:この表記がどのように機能するかについては、Cronを使用してVPSでタスクを自動化する方法を参照してください。

次に、スクリプトを実行します。

  1. node cron-ping.js

数分後、次の結果が得られます。

Output
running a task every minute running a task every minute running a task every minute ...

毎分実行されるサンプルタスクがあります。 CTRL+CCONTROL+C)でサーバーを停止できます。

それでは、タスクを実行する方法を詳しく見ていきましょう。

ステップ3—エラーログを削除する

毎月21日にサーバーからログファイルを定期的に削除する必要があるシナリオを考えてみます。 これはnode-cronで実現できます。

error.logという名前のサンプルログファイルを作成します。

  1. nano error.log

次に、テストメッセージを追加します。

エラーログ
This is an example error message that in a log file that will be removed on the twenty-first day of the month.

新しいcron-delete.jsファイルを作成します。

  1. nano cron-delete.js

このタスクでは、fsからunlinkのファイルを使用します。 ファイルの先頭に追加します。

cron-delete.js
const cron = require('node-cron');
const fs = require('fs');

次に、次のコード行を追加します。

cron-delete.js
// ...

// Remove the error.log file every twenty-first day of the month.
cron.schedule('0 0 21 * *', function() {
  console.log('---------------------');
  console.log('Running Cron Job');
  fs.unlink('./error.log', err => {
    if (err) throw err;
    console.log('Error file successfully deleted');
  });
});

パターンに注意してください:0 0 21 * *

  • 分と時間の値を0および0(「00:00」-日の始まり)として定義します。
  • 日の値を21として定義します。
  • 月や曜日は定義されません。

次に、スクリプトを実行します。

  1. node cron-delete.js

その月の21日に、次の出力が表示されます。

Output
--------------------- Running Cron Job Error file successfully deleted

タスクが実行されたことを確認するために、月の21日を待ちたくない場合があります。 スケジューラーを変更して、1分ごとなどの短い時間間隔で実行することができます。

サーバーディレクトリを確認してください。 error.logファイルが削除されます。

スケジューラー内で任意のアクションを実行できます。 ファイルの作成から電子メールの送信やスクリプトの実行に至るまでのアクション。 その他のユースケースを見てみましょう。

ステップ4—node-cronを使用してデータベースをバックアップする方法を検討する

ユーザーデータの保存を確実にすることは、あらゆるビジネスの鍵です。 予期しないイベントが発生し、データベースが破損または損傷した場合は、バックアップからデータベースを復元する必要があります。 ビジネス用の既存のバックアップがない場合は、深刻な問題が発生します。

毎日午後11時59分にデータベースのダンプを定期的にバックアップする必要があるシナリオを考えてみます。 これはnode-cronで実現できます。

:このユースケースでは、ローカルSQLiteデータベースをセットアップする必要があります。 データベースのインストールと作成の詳細については、ここでは説明しません。 別のシェルコマンドで自由に置き換えてください。

ご使用の環境にSQLiteがインストールされ、実行されていると想定します。 database.sqliteという名前のデータベースがある場合、データベースのバックアップを作成するためのシェルコマンドは次のようになります。

  1. sqlite3 database.sqlite .dump > data_dump.sql

このコマンドは、データベースdatabase.sqliteを取得し、.dumpコマンドを実行して、結果をdata_dump.sqlという名前のファイルとして出力します。

次に、shelljsをインストールします。これは、前のシェルコマンドを実行できるようにするノードモジュールです。

  1. npm install shelljs@0.8.4

新しいcron-dump.jsファイルを作成します。

  1. nano cron-dump.js

次に、shelljsを要求します。

cron-dump.js
const cron = require('node-cron');
const shell = require('shelljs');

次に、次のコード行を追加します。

cron-dump.js
// ...

// Backup a database at 11:59 PM every day.
cron.schedule('59 23 * * *', function() {
  console.log('---------------------');
  console.log('Running Cron Job');
  if (shell.exec('sqlite3 database.sqlite .dump > data_dump.sql').code !== 0) {
    shell.exit(1);
  }
  else {
    shell.echo('Database backup complete');
  }
});

パターンに注意してください:59 23 * * *

  • 分値を59と定義します。
  • 時間の値を23(または24時間制では11 PM)として定義します。
  • 日、月、または曜日を定義するものではありません。

このコードは、バックアップシェルコマンドを実行します。 成功すると、メッセージがエコーされます。 それ以外の場合、エラーが発生した場合は終了します。

次に、スクリプトを実行します。

  1. node cron-dump.js

午後11時59分に、次の出力が表示されます。

Output
--------------------- Running Cron Job Database backup complete

タスクが実行されたことを確認するために午後11時59分を待つことはおそらく望ましくありません。 より短い時間間隔で実行するようにスケジューラーを変更できます。

サーバーディレクトリを確認してください。 data_dump.sqlファイルが存在します。

次に、定期的なメールの送信を見てみましょう。

ステップ5—node-cronを使用してスケジュールされた電子メールを送信する方法を検討する

興味深いリンクのリストをキュレートし、毎週水曜日にサブスクライバーに電子メールで送信するシナリオを考えてみます。 これはnode-cronで実現できます。

Nodemailer は、EtherealEmailによって提供されるテストアカウントをサポートします。 Etherealアカウントを作成し、生成されたユーザー名とパスワードを使用します。

警告:この手順では個人の電子メールアカウントを使用しないことを強くお勧めします。 個人の電子メールアカウントへのリスクを回避するために、新しい個別のテストアカウントの使用を検討してください。

次に、nodemailerをインストールします。これは、メールを送信できるようにするノードモジュールです。

  1. npm install nodemailer@6.7.2

新しいcron-mail.jsファイルを作成します。

  1. nano cron-mail.js

次に、nodemailerを要求します。

cron-mail.js
const cron = require('node-cron');>
const nodemailer = require('nodemailer');

メーラーを定義し、電子メールアカウントのユーザー名とパスワードを設定するセクションを追加します。

cron-mail.js
// ...

// Create mail transporter.
let transporter = nodemailer.createTransport({
  host: 'your_demo_email_smtp_host.example.com',
  port: your_demo_email_port,
  auth: {
    user: '[email protected]',
    pass: 'your_demo_email_password'
  }
});

警告:この手順は、例としてのみ提供されています。 本番環境では、環境変数を使用してパスワードを秘密にします。 GitHubなどのコードリポジトリにアップロードするコードにパスワード(クレデンシャル)を保存しないでください。

次に、次のコード行を追加します。

cron-mail.js
// ...

// Sending emails every Wednesday.
cron.schedule('0 0 * * 3', function() {
  console.log('---------------------');
  console.log('Running Cron Job');

  let messageOptions = {
    from: '[email protected]',
    to: '[email protected]',
    subject: 'Scheduled Email',
    text: 'Hi there. This email was automatically sent by us.'
  };

  transporter.sendMail(messageOptions, function(error, info) {
    if (error) {
      throw error;
    } else {
      console.log('Email successfully sent!');
    }
  });
});

パターンに注意してください:0 0 * * 3

  • 分と時間の値を0および0(「00:00」-日の始まり)として定義します。
  • 月の日や月を定義するものではありません。
  • 曜日の値を'3'(水曜日)として定義します。

このコードは、提供された資格情報を使用して自分自身に電子メールを送信します。 件名:'Scheduled Email'、本文:'Hi there. This email was automatically sent by us.'。 それ以外の場合、失敗するとエラーがログに記録されます。

次に、スクリプトを実行します。

  1. node cron-mail.js

水曜日には、次の出力が得られます。

Output
--------------------- Running Cron Job Email successfully sent!

おそらく、タスクが実行されたことを確認するために水曜日を待つ必要はありません。 より短い時間間隔で実行するようにスケジューラーを変更できます。

EtherealEメールメールボックスを開きます。 受信トレイに新しい'Scheduled Email'があります。

結論

この記事では、node-cronを使用してNode.jsサーバーでジョブをスケジュールする方法を学びました。 一貫性のある予測可能な方法で反復タスクを自動化するというより広い概念を紹介しました。 この概念は、現在および将来のプロジェクトに適用できます。

利用可能な他のタスクスケジューラツールがあります。 それらを評価して、特定のプロジェクトに最適なツールを特定してください。

Node.jsの詳細については、Node.jsトピックページで演習とプログラミングプロジェクトを確認してください。