Advanced I/O Functionの設定
Alien Cityアプリケーションのコーディングを、functionコンポーネントの設定から始めましょう。
Node.jsのfunctionディレクトリ( functions/alien_city_function )には以下のファイルが含まれています:
- index.js メインfunctionファイル
- catalyst-config.json 設定ファイル
- Nodeモジュール
- package.json および package-lock.json 依存関係ファイル
index.js メインfunctionファイルにコードを追加します。
Advanced I/O functionには、サーバーとData Store間のルーティングを処理する2つのAPIがあります:
- GET /alien: 都市にエイリアンが存在するかどうかを確認する
- POST /alien: 都市でのエイリアンの存在を報告する
Express Node.jsフレームワークのインストール
Node.js functionでは、Express Node.jsフレームワークを使用します。コード内でExpressパッケージをインポートするには、システムにExpress依存関係をインストールする必要があります。
ローカルマシンにExpress.jsをインストールするには、ターミナルでNode functionのディレクトリ(functions/alien_city_function)に移動し、以下のコマンドを実行します:
copy
$
npm install express --save
これにより、Expressモジュールがインストールされ、依存関係が保存されます。
この情報はpackage.jsonファイルにも更新されます。
それでは、functionファイルにコードを追加しましょう。
以下のコードをコピーして、プロジェクトのfunctions/alien_city_functionディレクトリにあるindex.jsに貼り付けて、ファイルを保存してください。アプリケーションのファイルを操作するには、お好みのIDEを使用できます。
注意: このセクションのコードを十分に理解するために、必ず目を通してください。
index.js
copy
'use strict';
var express = require('express');
var app = express();
var catalyst = require('zcatalyst-sdk-node');
app.use(express.json());
const tableName = 'AlienCity'; // Data Storeに作成したテーブル
const columnName = 'CityName'; // テーブルに作成したカラム
// 特定の都市のエイリアン遭遇を報告するPOST API
app.post('/alien', (req, res) => {
var cityJson = req.body;
console.log(cityJson);
// Catalyst SDKの初期化
var catalystApp = catalyst.initialize(req);
// Catalyst Data Storeテーブルにクエリを実行し、指定された都市の行が存在するかどうかを確認します
getDataFromCatalystDataStore(catalystApp, cityJson.city_name).then(cityDetails => {
if (cityDetails.length == 0) { // 行が存在しない場合、新しい行を挿入します
console.log("Alien alert!"); // ログに記録されます。コンソールのMonitorセクションにあるLogsからこのログを確認できます
var rowData = {}
rowData[columnName] = cityJson.city_name;
var rowArr = [];
rowArr.push(rowData);
// Catalyst Data Storeテーブルに都市名を行として挿入します
catalystApp.datastore().table(tableName).insertRows(rowArr).then(cityInsertResp => {
res.send({
"message": "Thanks for reporting!"
});
}).catch(err => {
console.log(err);
sendErrorResponse(res);
})
} else { // 行が存在する場合、重複を示すメッセージを送信します
res.send({
"message": "Looks like you are not the first person to encounter aliens in this city! Someone has already reported an alien encounter here!"
});
}
}).catch(err => {
console.log(err);
sendErrorResponse(res);
})
});
// テーブルで該当都市のエイリアン遭遇を確認するGET API
app.get('/alien', (req, res) => {
var city = req.query.city_name;
// Catalyst SDKの初期化
var catalystApp = catalyst.initialize(req);
// Catalyst Data Storeテーブルにクエリを実行し、指定された都市の行が存在するかどうかを確認します
getDataFromCatalystDataStore(catalystApp, city).then(cityDetails => {
if (cityDetails.length == 0) {
res.send({
"message": "Hurray! No alien encounters in this city yet!",
"signal": "negative"
});
} else {
res.send({
"message": "Uh oh! Looks like there are aliens in this city!",
"signal": "positive"
});
}
}).catch(err => {
console.log(err);
sendErrorResponse(res);
})
});
/**
* 指定された都市のエイリアン遭遇が既に報告されているかどうかをData Storeテーブルにクエリを実行して確認します
* @param {*} catalystApp
* @param {*} cityName
*/
function getDataFromCatalystDataStore(catalystApp, cityName) {
return new Promise((resolve, reject) => {
// Catalyst Data Storeテーブルにクエリを実行します
catalystApp.zcql().executeZCQLQuery("SELECT * FROM AlienCity WHERE CityName = '" + cityName + "'").then(queryResponse => {
resolve(queryResponse);
}).catch(err => {
reject(err);
})
});
}
/**
* エラーレスポンスを送信します
* @param {*} res
*/
function sendErrorResponse(res) {
res.status(500);
res.send({
"error": "Internal server error occurred. Please try again in some time."
});
}
module.exports = app;
functionsディレクトリの設定が完了しました。次のセクションでは、functionとクライアントのアーキテクチャについて説明します。
最終更新日 2026-03-05 11:43:24 +0530 IST

