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);