お知らせ:

当社は、お客様により充実したサポート情報を迅速に提供するため、本ページのコンテンツは機械翻訳を用いて日本語に翻訳しています。正確かつ最新のサポート情報をご覧いただくには、本内容の英語版を参照してください。

Job Functionの設定

次に、Job Functionコンポーネントを設定して、ニュースアプリケーションのコーディングを開始します。

この関数のディレクトリ(functions/NewsApp)には以下が含まれています:

  • index.jsメイン関数ファイル
  • catalyst-config.json設定ファイル
  • Nodeモジュール
  • package.jsonおよびpackage-lock.json依存関係ファイル

index.jsファイルにコードを追加します。設定ファイルや依存関係ファイルのコードは変更しません。

はじめにで説明した通り、Job Functionは2つのタスクを実行します:NewsAPIへのAPI呼び出しによるニュース取得と、Catalyst Data Storeへのニュースの格納です。API呼び出しは、NewsAPIが提供するAPIキーを使用して行われます。

NewsAPIへの登録

Job Functionのコーディングを行う前に、NewsAPIの無料開発者サブスクリプションに登録し、以下の方法でAPIキーを取得する必要があります:

  1. https://newsapi.org/registerにアクセスします。

  2. 必要な情報を入力し、Submitをクリックします。

register-api-key

登録が完了すると、NewsAPIからAPIキーが提供されます。コードセクションの後の指示に従って、このキーをCron関数で使用する必要があります。

api-key

Node.js用パッケージのインストール

Node.js Cron関数には、expressaxiosの2つのパッケージをインストールする必要があります。

express

ファイルの取得と削除を可能にするルーティング操作を管理するために、Expressフレームワークを使用します。

expressをインストールするには、ターミナルで関数のディレクトリ(functions/NewsApp)に移動し、以下のコマンドを実行します:

copy
$
npm install express

これにより、Expressモジュールがインストールされ、依存関係が保存されます。

express

axios

axiosは、NewsAPIを実行してデータを取得するために使用するPromiseベースのHTTPクライアントです。

axiosをインストールするには、Node関数のディレクトリ(functions/NewsApp)に移動し、以下のコマンドを実行します:

copy
$
npm install axios

これによりモジュールがインストールされます。

axios

以下のコードをコピーして、プロジェクトのfunctions/NewsAppディレクトリにあるindex.jsに貼り付けてファイルを保存します。アプリケーションのファイルの操作には任意のIDEを使用できます。

Note: このセクションに記載されているコードを十分に理解するために、必ず目を通してください。
index.js
copy
/**
 * 
 * @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(); //アプリケーションの異常終了
	};
};

View more

Note: このコードを関数ファイルにコピー&ペーストした後、19行目のAPIKEYの値を、NewsAPIから取得したAPIキーに必ず置き換えてください。

Job Functionの設定が完了しました。クライアントの設定後にアプリケーションのアーキテクチャについて説明します。

最終更新日 2026-02-23 18:09:41 +0530 IST

関連リンク

Job Scheduling Job Functions