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 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 y package-lock.json
Agregarás código en index.js.
Puedes usar cualquier IDE para configurar la función.
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, node-fetch y 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:
Esto instalará el módulo Express y guardará las dependencias.
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):
Esto instalará el módulo.
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):
Esto instalará el módulo.
Esta información también se actualizará en el archivo package.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.
"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;
- Client ID en la línea 11
- Client Secret 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.
Última actualización 2026-03-20 21:51:56 +0530 IST


