node-cronを使用してNode.jsでスケジュールされたジョブを実行する方法
序章
cron は、特定の時間間隔でタスクを繰り返す方法を提供します。 ロギングやバックアップの実行など、毎日、毎週、または毎月実行する必要のある反復的なタスクが存在する場合があります。
Node.jsサーバーにcron
を実装する1つの方法は、node-cronモジュールを使用することです。 このライブラリはcrontab
構文を使用します。これは、Unixライクなオペレーティングシステムでcron
を使用した経験のあるユーザーにはおなじみかもしれません。
この記事では、node-cron
を使用して、サーバーからログファイルを定期的に削除します。 また、データベースのバックアップとスケジュールされた電子メールの送信という2つの一般的な使用例も提示されます。
前提条件
このチュートリアルを実行するには、次のものが必要です。
- Node.jsのローカル開発環境。 Node.jsをインストールしてローカル開発環境を作成する方法に従ってください。
このチュートリアルは、ノードv17.2.0、npm
v8.1.4、node-cron
v2.0.3、shelljs
v0.8.4、およびnodemailer
v6.7.2で検証されました。 。
ステップ1—ノードアプリケーションの作成と依存関係のインストール
開始するには、ターミナルを開き、プロジェクト用の新しいフォルダを作成して、新しいノードアプリケーションを作成します。
- mkdir node-cron-example
次に、新しいプロジェクトディレクトリに移動します。
- cd node-cron-example
次に、それを初期化します。これにより、依存関係の追跡に使用するpackage.json
ファイルが作成されます。
- npm init --yes
次のコマンドを実行して、node-cron
モジュールを追加します。
- npm install node-cron@3.0.0
node-cron
モジュールはタスクスケジューラです。
プロジェクトの依存関係がインストールされます。 サーバーを構築しましょう。
ステップ2—タスクのスケジュール
これで、サーバーを構築し、node-cron
を使用して、1分ごとに実行するタスクをスケジュールできます。
新しいcron-ping.js
ファイルを作成します。
- nano cron-ping.js
次に、node-cron
を要求します。
const cron = require('node-cron');
次に、次のコード行を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でタスクを自動化する方法を参照してください。
次に、スクリプトを実行します。
- node cron-ping.js
数分後、次の結果が得られます。
Outputrunning a task every minute
running a task every minute
running a task every minute
...
毎分実行されるサンプルタスクがあります。 CTRL+C
(CONTROL+C
)でサーバーを停止できます。
それでは、タスクを実行する方法を詳しく見ていきましょう。
ステップ3—エラーログを削除する
毎月21日にサーバーからログファイルを定期的に削除する必要があるシナリオを考えてみます。 これはnode-cron
で実現できます。
error.log
という名前のサンプルログファイルを作成します。
- 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
ファイルを作成します。
- nano cron-delete.js
このタスクでは、fs
からunlink
のファイルを使用します。 ファイルの先頭に追加します。
const cron = require('node-cron');
const fs = require('fs');
次に、次のコード行を追加します。
// ...
// 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
として定義します。 - 月や曜日は定義されません。
次に、スクリプトを実行します。
- 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
という名前のデータベースがある場合、データベースのバックアップを作成するためのシェルコマンドは次のようになります。
- sqlite3 database.sqlite .dump > data_dump.sql
このコマンドは、データベースdatabase.sqlite
を取得し、.dump
コマンドを実行して、結果をdata_dump.sql
という名前のファイルとして出力します。
次に、shelljs
をインストールします。これは、前のシェルコマンドを実行できるようにするノードモジュールです。
- npm install shelljs@0.8.4
新しいcron-dump.js
ファイルを作成します。
- nano cron-dump.js
次に、shelljs
を要求します。
const cron = require('node-cron');
const shell = require('shelljs');
次に、次のコード行を追加します。
// ...
// 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
)として定義します。 - 日、月、または曜日を定義するものではありません。
このコードは、バックアップシェルコマンドを実行します。 成功すると、メッセージがエコーされます。 それ以外の場合、エラーが発生した場合は終了します。
次に、スクリプトを実行します。
- 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
をインストールします。これは、メールを送信できるようにするノードモジュールです。
- npm install nodemailer@6.7.2
新しいcron-mail.js
ファイルを作成します。
- nano cron-mail.js
次に、nodemailer
を要求します。
const cron = require('node-cron');>
const nodemailer = require('nodemailer');
メーラーを定義し、電子メールアカウントのユーザー名とパスワードを設定するセクションを追加します。
// ...
// 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などのコードリポジトリにアップロードするコードにパスワード(クレデンシャル)を保存しないでください。
次に、次のコード行を追加します。
// ...
// 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.'
。 それ以外の場合、失敗するとエラーがログに記録されます。
次に、スクリプトを実行します。
- node cron-mail.js
水曜日には、次の出力が得られます。
Output---------------------
Running Cron Job
Email successfully sent!
おそらく、タスクが実行されたことを確認するために水曜日を待つ必要はありません。 より短い時間間隔で実行するようにスケジューラーを変更できます。
EtherealEメールメールボックスを開きます。 受信トレイに新しい'Scheduled Email'
があります。
結論
この記事では、node-cron
を使用してNode.jsサーバーでジョブをスケジュールする方法を学びました。 一貫性のある予測可能な方法で反復タスクを自動化するというより広い概念を紹介しました。 この概念は、現在および将来のプロジェクトに適用できます。
利用可能な他のタスクスケジューラツールがあります。 それらを評価して、特定のプロジェクトに最適なツールを特定してください。
Node.jsの詳細については、Node.jsトピックページで演習とプログラミングプロジェクトを確認してください。