--- title: "Configurar el directorio de funciones" url: https://docs.catalyst.zoho.com/es/tutorials/leadmanager/nodejs/configure-functions-directory/ description: "Construye una aplicación Lead Manager que se conecte a tu cuenta de Zoho CRM con el conector de Catalyst para ver, crear, actualizar o eliminar leads." last_updated: 2026-11-04T10:10:44Z service: All Services type: tutorial related_links: - name: "Advanced I/O Functions" url: /es/serverless/help/functions/advanced-io/ - name: "Functions Directory Structure" url: /es/cli/v1/project-directory-structure/functions-directory --- # Configurar el directorio de funciones Ahora comenzaremos a codificar la aplicación Lead Manager configurando la función Advanced I/O. El directorio de funciones [](https://docs.catalyst.zoho.com/es/cli/v1/project-directory-structure/functions-directory) `functions/crm\_crud` contiene: * El archivo principal de la función `index.js` * El archivo de configuración `catalyst-config.json` * Módulos de Node * Archivos de dependencias `[package.json](https://docs.npmjs.com/files/package.json)` y `[package-lock.json](https://docs.npmjs.com/configuring-npm/package-lock-json.html)` Agregarás código en `index.js`. Puedes usar cualquier IDE para configurar la función. > **Nota:** Por favor revisa el código en esta sección para asegurarte de que lo comprendes completamente. Discutiremos el código de la función y del cliente, después de que configures el cliente. ### Instalar los frameworks Express y Node Fetch para Node.js La función de Node.js requiere la instalación de tres frameworks. Debes instalar las dependencias [express](https://expressjs.com/), [node-fetch](https://www.npmjs.com/package/node-fetch) y [axios](https://www.npmjs.com/package/axios) para importar esos paquetes en tu código. #### `express` Para instalar `Express.js`, navega al directorio de la función de Node (`functions/crm\_crud`) en tu terminal y ejecuta el siguiente comando: ```sh npm install express --save ``` Esto instalará el módulo Express y guardará las dependencias. ![catalyst_leadmanager_install_express](https://catalyst-docs-development.zohostratus.in/images/tutorials/leadmanager/catalyst_leadmanager_install_express.webp) #### `node-fetch` Para instalar `node-fetch`, ejecuta el siguiente comando desde el directorio de la función de Node, navega al directorio de la función de Node (`functions/crm\_crud`): ```sh npm install node-fetch ``` Esto instalará el módulo. ![catalyst_leadmanager_install_node_fetch](https://catalyst-docs-development.zohostratus.in/images/tutorials/leadmanager/catalyst_leadmanager_install_node_fetch.webp) #### `axios` Para instalar `axios`, ejecuta el siguiente comando desde el directorio de la función de Node, navega al directorio de la función de Node (`functions/crm\_crud`): ```sh npm install axios ``` Esto instalará el módulo. ![catalyst_leadmanager_install_axios](https://catalyst-docs-development.zohostratus.in/images/tutorials/leadmanager/catalyst_leadmanager_install_axios.webp) Esta información también se actualizará en el archivo [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" } } ``` Ahora puedes agregar el código en el archivo de la función. Copia el código a continuación y pégalo en `index.js` ubicado en el directorio `functions/crm\_crud` y guarda el archivo. **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}}'; //Agrega tu Client ID const CLIENT_SECRET = '{{YOUR_CLIENT_SECRET}}'; //Agrega tu 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; ``` > **Nota:** Después de copiar y pegar este código en tu archivo de función, asegúrate de reemplazar los siguientes valores en él: * [Client ID](https://docs.catalyst.zoho.com/es/tutorials/leadmanager/nodejs/register-client) en la línea 11 * [Client Secret](https://docs.catalyst.zoho.com/es/tutorials/leadmanager/nodejs/register-client) en la línea 12 El directorio de funciones está ahora configurado. Discutiremos el código de la función y del cliente, después de que configures el cliente.