Configurar la Job Function
A continuación, comenzaremos a codificar la aplicación de noticias configurando el componente de la job function.
El directorio de la función, en este caso functions/NewsApp, 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
Agregaremos código en el archivo index.js. No modificará el código de los archivos de configuración y dependencias.
Como se mencionó en la introducción, la job function realiza dos tareas: hacer las llamadas API a NewsAPI para obtener noticias, y poblar las noticias en Catalyst Data Store. Las llamadas API se realizan utilizando una clave API proporcionada por NewsAPI.
Registrarse en NewsAPI
Antes de codificar la job function, debe registrarse para una suscripción gratuita de desarrollador con NewsAPI y obtener la clave API de la siguiente manera:
-
Visite https://newsapi.org/register.
-
Proporcione los detalles requeridos y haga clic en Submit.
Después de completar su registro, NewsAPI le proporcionará una clave API. Debe usarla en su función cron, como se indica después de la sección de código.
Instalar paquetes para Node.js
La función Cron de Node.js requiere la instalación de dos paquetes: express y axios.
express
Usaremos el framework Express para gestionar las operaciones de enrutamiento que nos permiten obtener y eliminar archivos.
Para instalar express, navegue al directorio de la función (functions/NewsApp) en su terminal y ejecute el siguiente comando:
Esto instalará el módulo Express y guardará las dependencias.
axios
axios es un cliente HTTP basado en promesas que usaremos para obtener datos ejecutando la NewsAPI.
Para instalar axios, navegue al directorio de la función Node (functions/NewsApp) y ejecute el siguiente comando:
Esto instalará el módulo.
Puede copiar el código a continuación y pegarlo en index.js ubicado en el directorio functions/NewsApp de su proyecto y guardar el archivo. Puede usar cualquier IDE para trabajar con los archivos de la aplicación.
/**
*
* @param {import("./types/job").JobRequest} jobRequest
* @param {import("./types/job").Context} context
*/
const catalyst = require("zcatalyst-sdk-node");
const axios = require('axios');
const HOST = "https://newsapi.org";
const TABLENAME = [
"HEADLINES",
"BUSINESS",
"ENTERTAINMENT",
"HEALTH",
"SCIENCE",
"SPORTS",
"TECHNOLOGY",
];
const COUNTRY = "US";
const APIKEY = "cc30ddcae1684e848f08ed474f6aaf0e";
const DATASTORE_LOAD = 5;
const pushNewstoDatastore = async ({ table, rowIds, articles }) => {
return Promise.all(
articles.map(async (article, idx) => {
const payload = {
title: article.title,
url: article.url,
};
if (rowIds.length === 0) {
//insertar la nueva fila
return table.insertRow(payload);
}
return table.updateRow({ ...payload, ROWID: rowIds[idx] });
})
);
};
module.exports = async (jobRequest, context) => {
try{
console.log('Execution started');
const catalystApp = catalyst.initialize(context);
const zcqlAPI = catalystApp.zcql();
const datastoreAPI = catalystApp.datastore();
const metaArr = await Promise.all(
TABLENAME.map(async (table) => {
//construir la ruta de solicitud a newsapi
let url = `${HOST}/v2/top-headlines?country=${COUNTRY}&apiKey=${APIKEY}`;
if (table !== TABLENAME[0]) {
url += "&category=" + table;
}
const response = await axios({
method: "GET",
url
});
let data = response.data;
//consultar usando zcql para verificar si la fila existe
const queryResult = await zcqlAPI.executeZCQLQuery(
`SELECT ROWID FROM ${table}`
);
return {
table_name: table,
table: datastoreAPI.table(table),
zcql_response: queryResult,
articles: data.articles.splice(0, 15),
};
})
);
//inserción/actualización sincrónica al datastore
for (const meta of metaArr) {
let rowIds = [];
while (meta.articles.length > 0) {
const chunk = meta.articles.splice(0, DATASTORE_LOAD);
if (meta.zcql_response.length > 0) {
rowIds = meta.zcql_response
.splice(0, DATASTORE_LOAD)
.map((row) => row[meta.table_name].ROWID);
}
await pushNewstoDatastore({ ...meta, articles: chunk, rowIds });
}
console.log(
`${meta.table} table ${
rowIds.length === 0 ? "inserted" : "updated"
} with current news'`
);
}
context.closeWithSuccess(); //fin de la aplicación con éxito
}catch(err){
console.log("Error :: "+err);
context.closeWithFailure(); //fin de la aplicación con error
};
};
La job function está ahora configurada. Discutiremos la arquitectura de la aplicación después de configurar el client.
Última actualización 2026-03-20 21:51:56 +0530 IST



