--- title: "ファンクションディレクトリの設定" url: https://docs.catalyst.zoho.com/ja/tutorials/leadmanager/nodejs/configure-functions-directory/ description: "Catalystコネクタを使用してZoho CRMアカウントに接続し、リードモジュールから直接リードの表示、作成、更新、削除を行えるLead Managerアプリケーションを構築します" 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ファンクションを設定して、Lead Managerアプリケーションのコーディングを開始します。 ファンクションディレクトリ[](https://docs.catalyst.zoho.com/ja/cli/v1/project-directory-structure/functions-directory) `functions/crm\_crud`には、以下が含まれています: * `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`にコードを追加します。 任意のIDEを使用してファンクションを設定できます。 > **Note:** このセクションのコードを十分に理解するために、必ず目を通してください。ファンクションとクライアントのコードについては、クライアントの設定後に説明します。 ### Node.js用のExpressおよびNode Fetchフレームワークのインストール Node.jsファンクションには3つのフレームワークをインストールする必要があります。コード内でパッケージをインポートするために、[express](https://expressjs.com/)、[node-fetch](https://www.npmjs.com/package/node-fetch)、および[axios](https://www.npmjs.com/package/axios)の依存関係をインストールする必要があります。 #### `express` `Express.js`をインストールするには、ターミナルでNodeファンクションのディレクトリ(`functions/crm\_crud`)に移動し、以下のコマンドを実行します: ```sh npm install express --save ``` これにより、Expressモジュールがインストールされ、依存関係が保存されます。 ![catalyst_leadmanager_install_express](https://catalyst-docs-development.zohostratus.in/images/tutorials/leadmanager/catalyst_leadmanager_install_express.webp) #### `node-fetch` `node-fetch`をインストールするには、Nodeファンクションのディレクトリ(`functions/crm\_crud`)から以下のコマンドを実行します: ```sh npm install node-fetch ``` これにより、モジュールがインストールされます。 ![catalyst_leadmanager_install_node_fetch](https://catalyst-docs-development.zohostratus.in/images/tutorials/leadmanager/catalyst_leadmanager_install_node_fetch.webp) #### `axios` `axios`をインストールするには、Nodeファンクションのディレクトリ(`functions/crm\_crud`)から以下のコマンドを実行します: ```sh npm install axios ``` これにより、モジュールがインストールされます。 ![catalyst_leadmanager_install_axios](https://catalyst-docs-development.zohostratus.in/images/tutorials/leadmanager/catalyst_leadmanager_install_axios.webp) この情報は[package.json](https://docs.npmjs.com/files/package.json)ファイルにも更新されます。 ```json { "name": "crm_crud", "version": "1.0.0", "main": "index.js", "author": "amelia.burrows@zylker.com", "dependencies": { "axios": "^0.27.2", "express": "^4.18.1", "node-fetch": "^3.2.6", "zcatalyst-sdk-node": "latest" } } ``` これでファンクションファイルにコードを追加できます。 以下のコードをコピーして、`functions/crm\_crud`ディレクトリにある`index.js`に貼り付けて、ファイルを保存してください。 **index.js** ```javascript "use strict"; const express = require("express"); const http = require("https"); const app = express(); app.use(express.json()); const catalyst = require("zcatalyst-sdk-node"); const HOST = "www.zohoapis.com"; const AUTH_HOST = "https://accounts.zoho.com/oauth/v2/token"; const PORT = 443; const axios = require("axios"); const CLIENTID = '{{YOUR_CLIENT_ID}}'; //クライアントIDを追加 const CLIENT_SECRET = '{{YOUR_CLIENT_SECRET}}'; //クライアントシークレットを追加 app.get("/generateToken", async (req, res) => { try { const catalystApp = catalyst.initialize(req); const code = req.query.code; let userManagement = catalystApp.userManagement(); let userDetails = await userManagement.getCurrentUser(); const domain = `${process.env.X_ZOHO_CATALYST_IS_LOCAL === 'true' ? "http" : "https"}://${process.env.X_ZOHO_CATALYST_IS_LOCAL === 'true' ? req.headers.host : req.headers.host.split(':')[0]}` const refresh_token = await getRefreshToken(code, res, domain); const userId = userDetails.user_id; const catalystTable = catalystApp.datastore().table("Token"); await catalystTable.insertRow({ refresh_token, userId, }); res.status(200).redirect(`${domain}/app/index.html`); } catch (err) { console.log(err); res .status(500) .send({ message: "Internal Server Error. Please try again after sometime.", error: err, }); } }); app.get("/getUserDetails", async (req, res) => { try { const catalystApp = catalyst.initialize(req); const userDetails = await getUserDetails(catalystApp); if (userDetails.length !== 0) { res.status(200).send({ userId: userDetails[0].Token.userId }); } else { res.status(200).send({ userId: null }); } } catch (err) { console.log(err); res .status(500) .send({ message: "Internal Server Error in Getting User Details. Please try again after sometime.", error: err, }); } }); app.get("/crmData", async (req, res) => { try { console.log(); const catalystApp = catalyst.initialize(req); const userDetails = await getUserDetails(catalystApp); const accessToken = await getAccessToken(catalystApp, userDetails); const options = { hostname: HOST, port: PORT, method: "GET", path: `/crm/v2/Leads`, headers: { Authorization: `Zoho-oauthtoken ${accessToken}`, }, }; var data = ""; const request = http.request(options, function (response) { response.on("data", function (chunk) { data += chunk; }); response.on("end", function () { console.log(response.statusCode); res.setHeader("content-type", "application/json"); res.status(200).send(data); }); }); request.end(); } catch (err) { console.log(err); res .status(500) .send({ message: "Internal Server Error. Please try again after sometime.", }); } }); app.get("/crmData/:id", async (req, res) => { try { const catalystApp = catalyst.initialize(req); const userDetails = await getUserDetails(catalystApp); const accessToken = await getAccessToken(catalystApp, userDetails); const options = { hostname: HOST, port: PORT, method: "GET", path: `/crm/v2/Leads/${req.params.id}`, headers: { Authorization: `Zoho-oauthtoken ${accessToken}`, }, }; var data = ""; const request = http.request(options, function (response) { response.on("data", function (chunk) { data += chunk; }); response.on("end", function () { res.setHeader("content-type", "application/json"); res.status(200).send(data); }); }); request.end(); } catch (err) { console.log(err); res.status(500).send({ message: "Internal Server Error. Please try again after sometime.", }); } }); app.post("/crmData", async (req, res) => { try { const catalystApp = catalyst.initialize(req); const createData = req.body; const reqData = []; reqData.push(createData); const data = { data: reqData, }; if (!createData) { res.status(400).send({ message: "Data Not Found" }); } const userDetails = await getUserDetails(catalystApp); const accessToken = await getAccessToken(catalystApp, userDetails); const options = { hostname: HOST, port: PORT, method: "POST", path: `/crm/v2/Leads`, headers: { Authorization: `Zoho-oauthtoken ${accessToken}`, "Content-Type": "application/json", }, }; const request = http.request(options, function (response) { res.setHeader("content-type", "application/json"); response.pipe(res); }); request.write(JSON.stringify(data)); request.end(); } catch (err) { console.log(err); res .status(500) .send({ message: "Internal Server Error. Please try again after sometime.", }); } }); app.put("/crmData/:id", async (req, res) => { try { const catalystApp = catalyst.initialize(req); const updateData = req.body; const reqData = []; reqData.push(updateData); const data = { data: reqData, }; if (!updateData) { res.status(400).send({ message: "Update Data Not Found" }); } const userDetails = await getUserDetails(catalystApp); const accessToken = await getAccessToken(catalystApp, userDetails); const options = { hostname: HOST, port: PORT, method: "PUT", path: `/crm/v2/Leads/${req.params.id}`, headers: { Authorization: `Zoho-oauthtoken ${accessToken}`, "Content-Type": "application/json", }, }; const request = http.request(options, function (response) { res.setHeader("content-type", "application/json"); response.pipe(res); }); request.write(JSON.stringify(data)); request.end(); } catch (err) { console.log(err); res .status(500) .send({ message: "Internal Server Error. Please try again after sometime.", }); } }); app.delete("/crmData/:id", async (req, res) => { console.log(`/crm/v2/Leads/${req.params.id}`); try { const catalystApp = catalyst.initialize(req); const userDetails = await getUserDetails(catalystApp); const accessToken = await getAccessToken(catalystApp, userDetails); const options = { hostname: HOST, port: PORT, method: "DELETE", path: `/crm/v2/Leads/${req.params.id}`, headers: { Authorization: `Zoho-oauthtoken ${accessToken}`, "Content-Type": "application/json", }, }; const request = http.request(options, function (response) { res.setHeader("content-type", "application/json"); response.pipe(res); }); request.end(); } catch (err) { console.log(err); res.status(500).send({ message: "Internal Server Error. Please try again after sometime.", }); } }); async function getAccessToken(catalystApp, userDetails) { const refresh_token = userDetails[0].Token.refresh_token; const userId = userDetails[0].Token.userId; const credentials = { [userId]: { client_id: CLIENTID, client_secret: CLIENT_SECRET, auth_url: AUTH_HOST, refresh_url: AUTH_HOST, refresh_token, }, }; const accessToken = await catalystApp.connection(credentials).getConnector(userId).getAccessToken(); return accessToken; } async function getRefreshToken(code, res, domain) { try { const url = `${AUTH_HOST}?code=${code}&client_id=${CLIENTID}&client_secret=${CLIENT_SECRET}&grant_type=authorization_code&redirect_uri=${domain}/server/crm_crud/generateToken`; const response = await axios({ method: "POST", url }); return response.data.refresh_token; } catch (err) { console.log(err); res.status(500).send({ message: "Internal Server Error. Please try again after sometime.", error: err, }); } } async function getUserDetails(catalystApp) { let userDetails = await catalystApp.userManagement().getCurrentUser(); let userDetail = await catalystApp.zcql().executeZCQLQuery(`SELECT * FROM Token where UserId=${userDetails.user_id}`); return userDetail; } module.exports = app; ``` > **Note:** このコードをファンクションファイルにコピー&ペーストした後、以下の値を必ず置き換えてください: * 11行目の[Client ID](https://docs.catalyst.zoho.com/ja/tutorials/leadmanager/nodejs/register-client) * 12行目の[Client Secret](https://docs.catalyst.zoho.com/ja/tutorials/leadmanager/nodejs/register-client) ファンクションディレクトリの設定が完了しました。ファンクションとクライアントのコードについては、クライアントの設定後に説明します。