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キーを取得する必要があります:
-
https://newsapi.org/registerにアクセスします。
-
必要な情報を入力し、Submitをクリックします。
登録が完了すると、NewsAPIからAPIキーが提供されます。コードセクションの後の指示に従って、このキーをCron関数で使用する必要があります。
Node.js用パッケージのインストール
Node.js Cron関数には、expressとaxiosの2つのパッケージをインストールする必要があります。
express
ファイルの取得と削除を可能にするルーティング操作を管理するために、Expressフレームワークを使用します。
expressをインストールするには、ターミナルで関数のディレクトリ(functions/NewsApp)に移動し、以下のコマンドを実行します:
これにより、Expressモジュールがインストールされ、依存関係が保存されます。
axios
axiosは、NewsAPIを実行してデータを取得するために使用するPromiseベースのHTTPクライアントです。
axiosをインストールするには、Node関数のディレクトリ(functions/NewsApp)に移動し、以下のコマンドを実行します:
これによりモジュールがインストールされます。
以下のコードをコピーして、プロジェクトのfunctions/NewsAppディレクトリにあるindex.jsに貼り付けてファイルを保存します。アプリケーションのファイルの操作には任意のIDEを使用できます。
/**
*
* @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(); //アプリケーションの異常終了
};
};
Job Functionの設定が完了しました。クライアントの設定後にアプリケーションのアーキテクチャについて説明します。
最終更新日 2026-02-23 18:09:41 +0530 IST



