--- title: "Advanced I/O Functionの設定" url: https://docs.catalyst.zoho.com/ja/tutorials/dialer-app/nodejs/configure-advanced-function/ description: "Catalyst Advanced I/O Functions、DataStoreおよびTwilioのVoice APIとの連携を使用して、営業チームと顧客間の発信通話接続を確立するダイヤラーアプリケーションを構築します。" last_updated: 2026-08-17T12:16:04Z service: All Services type: tutorial related_links: - name: "Advanced I/O Functions" url: /ja/serverless/help/functions/advanced-io/ - name: "Functionsディレクトリ構造" url: /ja/cli/v1/project-directory-structure/functions-directory --- # Advanced I/O Functionの設定 Functionコンポーネントの設定から、ダイヤラーアプリのコーディングを始めましょう。 Functionのディレクトリ`functions/dialer`には、以下が含まれています: * `index.js` メインFunctionファイル * `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)` 依存関係ファイル ### Node.jsパッケージのインストール 先に進む前に、アプリケーションのFunctionsディレクトリに2つの追加パッケージをインストールする必要があります。 #### **Express** コード内で[Express Node.js](https://expressjs.com/)パッケージをインポートするには、システムにExpressの依存関係をインストールする必要があります。Expressフレームワークは、ルートの管理やHTTPリクエストへの応答に使用されます。 ローカルマシンに`Express.js`をインストールするには、ターミナルでFunctionのホームディレクトリ(`functions/dialer`)に移動し、以下のコマンドを実行します: ```sh npm install express --save ``` これにより、Expressモジュールがインストールされ、依存関係が保存されます。 ![install-express](https://catalyst-docs-development.zohostratus.in/images/tutorials/dialer-app/install-express.webp) #### **Twilio** このチュートリアルでは、Twilioパッケージもインストールする必要があります。TwilioライブラリはTwilio APIへのHTTPリクエストを送信できるようにします。以下のコマンドを実行してTwilioの依存関係を追加してください。 ```sh npm install twilio ``` ![install-twilio](https://catalyst-docs-development.zohostratus.in/images/tutorials/dialer-app/install-twilio.webp) この情報は`package.json`ファイルにも更新されます。 ![package-json](https://catalyst-docs-development.zohostratus.in/images/tutorials/dialer-app/package-json.webp) 次に、Functionファイルにコードを追加しましょう。Node.jsコードをコピーして、`functions/dialer`ディレクトリの`index.js`に貼り付けてください。アプリケーションのファイルの作業には、お好みのIDEを使用できます。 > **注意**: このセクションで示されたコードを十分に理解できるよう確認してください。FunctionとClientのアーキテクチャについては、次のセクションで説明します。 **index.js** ```javascript const express = require("express"); const app = express(); var twilio = require('twilio'); const VoiceResponse = require("twilio").twiml.VoiceResponse; var catalyst = require('zcatalyst-sdk-node'); var YOUR_TWILIO_NUMBER = '+15612993019'; //Twilio電話番号に置き換えてください var accountSid = "xxxxxxxxxxxxxxx"; //Twilio Account SIDに置き換えてください var authToken = "{{7xxxxxxxxxxxxxxxxx8}}"; //Twilio Auth Tokenに置き換えてください var twilioClient = twilio(accountSid, authToken); var bodyParser = require('body-parser'); app.use(bodyParser.json()); // JSONエンコードされたボディをサポート app.use(bodyParser.urlencoded({ extended: true })); // エンコードされたボディをサポート app.post("/makeCall", async (req, res) => { try { var salesNumber = req.body.salesNumber; console.log(req.body) const catalystApp = catalyst.initialize(req); let rowData = { fromNumber: req.body.phoneNumber, toNumber: req.body.salesNumber }; console.log(rowData) const catalystTable = catalystApp.datastore().table('CallLog'); const data = await catalystTable.insertRow(rowData); var url = 'https://' + req.headers.host + '/server/dialer/outbound/' + encodeURIComponent(salesNumber); var options = { to: req.body.phoneNumber, from: YOUR_TWILIO_NUMBER, url: url, method: 'post', statusCallbackEvent: ['answered', 'completed'], statusCallback: 'https://' + req.headers.host + '/server/dialer/statusCheck?ROWID=' + data.ROWID, statusCallbackMethod: 'POST' }; twilioClient.calls.create(options).then((call) => { res.status(200).send({ message: 'Call Initiated' }); }).catch((error) => { console.log(error); res.status(500).send({ "error": error }); }); } catch (e) { console.log("Exception while making a Call ::" + e); res.status(500).send({ "error": 'Internal Server Error Occured. Please Try again after sometime.' }); } }); app.post('/outbound/:salesNumber', function (req, res) { try { var salesNumber = req.params.salesNumber; var twimlResponse = new VoiceResponse(); twimlResponse.say('Thanks for trying out the Catalyst Dialer App. Please hold on so that we can connect with your Customer... ', { voice: 'alice' }); twimlResponse.dial(salesNumber); res.status(200).send(twimlResponse.toString()); } catch (e) { console.log("Exception while making Outbound Call ::" + e); res.status(500).send({ "error": 'Internal Server Error Occured. Please Try again after sometime.' }); } }); app.post('/statusCheck', async (req, res) => { try { const catalystApp = catalyst.initialize(req); if (req.body.CallStatus === "completed") { let updatedRowData = { callDuration: req.body.CallDuration, callStatus: req.body.CallStatus, calledCountry: req.body.CalledCountry, calledState: req.body.CalledState, timeOfCall: req.body.Timestamp, ROWID: req.body.ROWID }; console.log(updatedRowData) const catalystTable = catalystApp.datastore().table('CallLog'); await catalystTable.updateRow(updatedRowData); } res.status(200).send(' StatusCheck Completed'); } catch (e) { console.log("Exception while checking status :: " + e); res.status(500).send({ "error": 'Internal Server Error Occured. Please Try again after sometime.' }); } }); app.get('/getLogs', async function (req, res) { try { const catalystApp = catalyst.initialize(req); const query = 'SELECT callDuration,callStatus,calledCountry,timeOfCall,fromNumber,toNumber FROM CallLog'; const queryResult = await catalystApp.zcql().executeZCQLQuery(query); res.status(200).send(queryResult); } catch (e) { console.log("Exception while getting Call Logs ::" + e); res.status(500).send({ "error": 'Internal Server Error Occured. Please Try again after sometime.' }); } }); module.exports = app; ``` > **注意**: 6行目、7行目、8行目にTwilioのアカウントID、関連するTwilio電話番号、およびAuth Tokenの値を必ず追加してください。 Functionsディレクトリの設定が完了しました。FunctionとClientのコードについては、次のセクションで説明します。