Avalados por :

Cómo exponer un servicio CAP con Express para implementar métodos REST

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 4 Vistas
0
Cargando...

Hola comunidad,

Estoy dando mis primeros pasos hacia un servicio CAP para construir un servicio. El propósito principal de este servicio es:

  • Adjunta sap-eventmesh y recopila eventos de SAP SuccessFactors (SF)
  • Almacena el evento entrante para la seguridad del proceso en una tabla de base de datos postgresql
  • Llama a un servicio externo odata-service en SF con datos de carga del evento para obtener detalles
  • Llama a otro servicio para crear un expediente en un sistema externo de gestión de documentos (onPremise detrás de un conector de nube utilizando un servicio de destino y conectividad)

Este sistema externo de gestión de documentos llama a estos servicios de vuelta para algunos datos y así mi servicio tiene que exponer un servicio web rest (sin odata) sin autenticación.

En el entorno de desarrollo local esto funciona bien hasta ahora, incluida la persistencia en una base de datos postgresql basada en docker local (gracias a Mike Zaschka y Gregor Wolf por su trabajo para poder usar postgresql con cap y sus blogs comunitarios). Actualmente en el desarrollo local aún no uso destinos, sino direcciones almacenadas, claves de API en package.json en una parte personalizada de la entrada "cds" y accedo a ellas usando:

cds.env.get("<nombresecciónprivada")

Ahora vamos a mi problema en sí.

Uno de los últimos pasos para implementar la aplicación en SAP-BTP es iniciarlo. Esto falla debido al siguiente error que encontré en los registros de implementación:

[PollStartAppStatusExecution] [myservicename-srv] 8a3b9a31-4711-4ed2-b8fd-c40c2148b725 [Vie Abr 08 09:09:04 UTC 2022] [ERROR] listen EADDRINUSE: dirección ya en uso 0.0.0.0:8080 (STDERR, APP/PROC/WEB)#

Creo que tiene algo que ver con la forma en que inicializo cap. Como mencioné anteriormente, necesito exponer un servicio web rest simple para el cual uso express y su servicio (app) llama app.get("/mipath") para implementar estos métodos rest.

Entonces descubrí que CAP se puede utilizar junto con express al usar un custom.js que primero instancia un servicio express y luego indica a cap que use esta instancia personalizada de cap.

Ya encontré por las salidas de la consola que "process.env.PORT" entrega 8080 y "process.env.HOST" es indefinido.

El siguiente fragmento de código está abreviado y muestra solo las partes relevantes. Así que no se fije en errores de escritura 🙂

const express = require('express');const app = express();const cds = require('@sap/cds');const options = {};// más líneas de código ....
async function cap_bootstrap(o) {   await cds.connect.to('db');   await cds.serve.in(app);
    
            
Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

1 Respuestas

0
Cargando...

Hola Comunidad,

Encontré una solución para mí mismo. Ahora uso los eventos del ciclo de vida disparados por cds. En este caso especial, utilizo el evento 'listening' en el cual en el callback guardo la instancia de express, que cds creó implícitamente, en una variable global y llamo a una función que hace las cosas para las cuales quiero express directamente. Ver ejemplo de código a continuación:

cds.on('listening', () => {
  oApp = cds.app; // oApp está definido globalmente
  main();
}
por supuesto, también sería posible usar directamente cds.app en todas partes de la aplicación en lugar de una variable global 'oApp'.


Saludos cordiales, Matthias

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?