--- title: "Codificar la lógica del backend" url: https://docs.catalyst.zoho.com/es/tutorials/leadmanager-appsail/express/backend-code/ description: "Construye una aplicación Lead Manager en AppSail que se conecta a Zoho CRM con conectores de Catalyst para ver, crear, actualizar o eliminar leads." last_updated: 2026-11-04T10:10:44Z service: All Services type: tutorial related_links: - name: "Node SDK" url: /es/sdk/nodejs/v2/overview/ --- # Codificar la Lógica del Backend Has creado el archivo "`index.js`" en el directorio raíz de tu proyecto, y este contendrá la lógica del backend de tu aplicación. > **Nota:** Por favor revisa el código en esta sección para asegurarte de comprenderlo completamente. Copia el código a continuación y pégalo en los archivos respectivos de tu proyecto usando un IDE y guarda los archivos. **index.js** ```javascript const catalyst = require('zcatalyst-sdk-node'); const express = require('express'); const axios = require('axios'); const http = require('https') const app = express() app.use(express.static('public')); app.use(express.json()); const HOST = "www.zohoapis.com"; const AUTH_HOST = "https://accounts.zoho.com/oauth/v2/token"; const PORT = 443; const CLIENTID = ''; //Agrega tu Client ID const CLIENT_SECRET = ''; //Agrega tu Client Secret app.get("/generateToken", async (req, res) => { try { console.log("Entered generated token") const catalystApp = catalyst.initialize(req); const code = req.query.code; 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]}` let userManagement = catalystApp.userManagement(); const refresh_token = await getRefreshToken(code, res, domain); let userDetails = await userManagement.getCurrentUser(); const catalystTable = catalystApp.datastore().table("Token"); const userId = userDetails.user_id; await catalystTable.insertRow({ refresh_token, userId, }); res.status(200).redirect(`${domain}/index.html`); } catch (err) { console.error(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) { console.log("user present") res.status(200).send({ userId: userDetails[0].Token.userId }); } else { console.log("User not present") console res.status(200).send({ userId: null }); } } catch (err) { console.error(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 { 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 () { res.setHeader("content-type", "application/json"); res.status(200).send(data); }); }); request.end(); } catch (err) { console.error(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.error(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"); let responseData = ''; response.on('data', (chunk) => { responseData += chunk; }); response.on('end', () => { console.log('Response from the external request:', responseData); }); response.pipe(res); }); request.write(JSON.stringify(data)); request.end(); } catch (err) { console.error(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.error(err); res.status(500).send({ message: "Internal Server Error. Please try again after sometime.", }); } }); app.delete("/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: "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.error(err); res.status(500).send({ message: "Internal Server Error. Please try again after sometime.", }); } }); app.get("/getAccessToken",async (req, res)=>{ try{ const catalystApp = catalyst.initialize(req); const userDetails = await getUserDetails(catalystApp); const access_token = await getAccessToken(catalystApp, userDetails) res.send(access_token) } catch(err){ console.error(err); } }) 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}/generateToken`; const response = await axios({ method: "POST", url }); console.log(response.data.refresh_token) 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; } app.listen(process.env.X_ZOHO_CATALYST_LISTEN_PORT || 9000,()=>{ console.log(`Listening from port ${process.env.X_ZOHO_CATALYST_LISTEN_PORT}!!!`) }) module.exports = app; ``` > **Nota:** Agrega los valores de `Client ID` y `Client Secret` obtenidos después de registrar el cliente en la consola de API de Zoho en la línea **11** y **12** del código en el archivo `index.js`.