--- title: "Configurar la Job Function" url: https://docs.catalyst.zoho.com/es/tutorials/newsapp/nodejs/configure-job-function/ description: "Construya una aplicación web de noticias que obtiene automáticamente noticias de un servicio de terceros periódicamente utilizando el componente Cron de Catalyst Job Scheduling, y una Job Function y función Advanced I/O codificadas en Node.js." last_updated: 2026-08-17T12:16:04Z service: All Services type: tutorial related_links: - name: "Job Scheduling" url: /es/job-scheduling/getting-started/introduction/ - name: "Job Functions" url: /es/serverless/help/functions/job-functions/ --- # 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`](https://docs.npmjs.com/files/package.json) y [`package-lock.json`](https://docs.npmjs.com/configuring-npm/package-lock-json.html) 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](https://docs.catalyst.zoho.com/es/tutorials/newsapp/nodejs/introduction/), la job function realiza dos tareas: hacer las llamadas API a [NewsAPI](https://newsapi.org/) 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: 1. Visite [https://newsapi.org/register](https://newsapi.org/register). 2. Proporcione los detalles requeridos y haga clic en **Submit**. ![register-api-key](https://catalyst-docs-development.zohostratus.in/images/tutorials/cron/register-api-key.webp) 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. ![api-key](https://catalyst-docs-development.zohostratus.in/images/tutorials/cron/api-key.webp) ### Instalar paquetes para Node.js La función Cron de Node.js requiere la instalación de dos paquetes: [`express`](https://www.npmjs.com/package/express) y [`axios`](https://www.npmjs.com/package/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: ```sh npm install express ``` Esto instalará el módulo Express y guardará las dependencias. ![express](https://catalyst-docs-development.zohostratus.in/images/tutorials/cron/express.webp) `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: ```sh npm install axios ``` Esto instalará el módulo. ![axios](https://catalyst-docs-development.zohostratus.in/images/tutorials/cron/axios.webp) 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. > **Nota**: Por favor, revise el código proporcionado en esta sección para asegurarse de que lo comprende completamente. **index.js** ```javascript /** * * @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 }; }; ``` > **Nota**: Después de copiar y pegar este código en su archivo de función, asegúrese de reemplazar el valor de `APIKEY` en la línea **19** con la clave API que obtuvo de NewsAPI. La job function está ahora configurada. Discutiremos la arquitectura de la aplicación después de configurar el client.