--- title: "Job Functionの設定" url: https://docs.catalyst.zoho.com/ja/tutorials/newsapp/nodejs/configure-job-function/ description: "Catalyst Job Scheduling Cronコンポーネントと、Node.jsで記述されたJob FunctionおよびAdvanced I/O Functionを使用して、サードパーティサービスから定期的にニュースを自動取得するWebニュースアプリケーションを構築します。" last_updated: 2026-08-17T12:16:04Z service: All Services type: tutorial related_links: - name: "Job Scheduling" url: /ja/job-scheduling/getting-started/introduction/ - name: "Job Functions" url: /ja/serverless/help/functions/job-functions/ --- # Job Functionの設定 次に、Job Functionコンポーネントを設定して、ニュースアプリケーションのコーディングを開始します。 この関数のディレクトリ(`functions/NewsApp`)には以下が含まれています: * `index.js`メイン関数ファイル * `catalyst-config.json`設定ファイル * Nodeモジュール * [`package.json`](https://docs.npmjs.com/files/package.json)および[`package-lock.json`](https://docs.npmjs.com/configuring-npm/package-lock-json.html)依存関係ファイル `index.js`ファイルにコードを追加します。設定ファイルや依存関係ファイルのコードは変更しません。 [はじめに](https://docs.catalyst.zoho.com/ja/tutorials/newsapp/nodejs/introduction/)で説明した通り、Job Functionは2つのタスクを実行します:[NewsAPI](https://newsapi.org/)へのAPI呼び出しによるニュース取得と、Catalyst Data Storeへのニュースの格納です。API呼び出しは、NewsAPIが提供するAPIキーを使用して行われます。 ### NewsAPIへの登録 Job Functionのコーディングを行う前に、NewsAPIの無料開発者サブスクリプションに登録し、以下の方法でAPIキーを取得する必要があります: 1. [https://newsapi.org/register](https://newsapi.org/register)にアクセスします。 2. 必要な情報を入力し、**Submit**をクリックします。 ![register-api-key](https://catalyst-docs-development.zohostratus.in/images/tutorials/cron/register-api-key.webp) 登録が完了すると、NewsAPIからAPIキーが提供されます。コードセクションの後の指示に従って、このキーをCron関数で使用する必要があります。 ![api-key](https://catalyst-docs-development.zohostratus.in/images/tutorials/cron/api-key.webp) ### Node.js用パッケージのインストール Node.js Cron関数には、[`express`](https://www.npmjs.com/package/express)と[`axios`](https://www.npmjs.com/package/axios)の2つのパッケージをインストールする必要があります。 `express` ファイルの取得と削除を可能にするルーティング操作を管理するために、Expressフレームワークを使用します。 `express`をインストールするには、ターミナルで関数のディレクトリ(`functions/NewsApp`)に移動し、以下のコマンドを実行します: ```sh npm install express ``` これにより、Expressモジュールがインストールされ、依存関係が保存されます。 ![express](https://catalyst-docs-development.zohostratus.in/images/tutorials/cron/express.webp) `axios` `axios`は、NewsAPIを実行してデータを取得するために使用するPromiseベースのHTTPクライアントです。 `axios`をインストールするには、Node関数のディレクトリ(`functions/NewsApp`)に移動し、以下のコマンドを実行します: ```sh npm install axios ``` これによりモジュールがインストールされます。 ![axios](https://catalyst-docs-development.zohostratus.in/images/tutorials/cron/axios.webp) 以下のコードをコピーして、プロジェクトの`functions/NewsApp`ディレクトリにあるindex.jsに貼り付けてファイルを保存します。アプリケーションのファイルの操作には任意のIDEを使用できます。 > **Note**: このセクションに記載されているコードを十分に理解するために、必ず目を通してください。 **index.js** ```javascript /** * * @param {import("./types/job").JobRequest} jobRequest * @param {import("./types/job").Context} context */ const catalyst = require("zcatalyst-sdk-node"); const axios = require('axios'); const HOST = "https://newsapi.org"; const TABLENAME = [ "HEADLINES", "BUSINESS", "ENTERTAINMENT", "HEALTH", "SCIENCE", "SPORTS", "TECHNOLOGY", ]; const COUNTRY = "US"; const APIKEY = "cc30ddcae1684e848f08ed474f6aaf0e"; const DATASTORE_LOAD = 5; const pushNewstoDatastore = async ({ table, rowIds, articles }) => { return Promise.all( articles.map(async (article, idx) => { const payload = { title: article.title, url: article.url, }; if (rowIds.length === 0) { //新しい行を挿入 return table.insertRow(payload); } return table.updateRow({ ...payload, ROWID: rowIds[idx] }); }) ); }; module.exports = async (jobRequest, context) => { try{ console.log('Execution started'); const catalystApp = catalyst.initialize(context); const zcqlAPI = catalystApp.zcql(); const datastoreAPI = catalystApp.datastore(); const metaArr = await Promise.all( TABLENAME.map(async (table) => { //NewsAPIへのリクエストパスを構築 let url = `${HOST}/v2/top-headlines?country=${COUNTRY}&apiKey=${APIKEY}`; if (table !== TABLENAME[0]) { url += "&category=" + table; } const response = await axios({ method: "GET", url }); let data = response.data; //ZCQLを使用して行が存在するか確認 const queryResult = await zcqlAPI.executeZCQLQuery( `SELECT ROWID FROM ${table}` ); return { table_name: table, table: datastoreAPI.table(table), zcql_response: queryResult, articles: data.articles.splice(0, 15), }; }) ); //DataStoreへの同期的な挿入/更新 for (const meta of metaArr) { let rowIds = []; while (meta.articles.length > 0) { const chunk = meta.articles.splice(0, DATASTORE_LOAD); if (meta.zcql_response.length > 0) { rowIds = meta.zcql_response .splice(0, DATASTORE_LOAD) .map((row) => row[meta.table_name].ROWID); } await pushNewstoDatastore({ ...meta, articles: chunk, rowIds }); } console.log( `${meta.table} table ${ rowIds.length === 0 ? "inserted" : "updated" } with current news'` ); } context.closeWithSuccess(); //アプリケーションの正常終了 }catch(err){ console.log("Error :: "+err); context.closeWithFailure(); //アプリケーションの異常終了 }; }; ``` > **Note**: このコードを関数ファイルにコピー&ペーストした後、**19**行目の`APIKEY`の値を、NewsAPIから取得したAPIキーに必ず置き換えてください。 Job Functionの設定が完了しました。クライアントの設定後にアプリケーションのアーキテクチャについて説明します。