Olá comunidade,
Estou dando os primeiros passos em direção a um serviço CAP para construir um serviço. O principal objetivo deste serviço é:
-
Anexar sap-eventmesh e coletar eventos do SAP SuccessFactors (SF)
-
Armazenar o evento de entrada para segurança do processo em uma tabela de banco de dados postgresql
-
Chamar um serviço externo odata-service no SF com dados de carga do evento para obter detalhes
-
Chamar outro serviço para criar um registro em um sistema externo de gerenciamento de documentos (onPremise atrás de um conector de nuvem usando um serviço de destino e conectividade)
Este sistema externo de gerenciamento de documentos chama esses serviços de volta para alguns dados e assim meu serviço precisa expor um serviço web rest (sem odata) sem autenticação.
No ambiente de desenvolvimento local, isso está funcionando bem até agora, incluindo a persistência em um banco de dados postgresql baseado em docker local (graças a Mike Zaschka e Gregor Wolf por seu trabalho para poder usar postgresql com cap e seus blogs comunitários). Atualmente, no desenvolvimento local, ainda não estou usando destinos, mas sim endereços armazenados, chaves de API no package.json em uma parte personalizada da entrada "cds" e acesso a elas usando:
cds.env.get("<nomeseçãoprivada")
Agora vamos para o meu problema em si.
Um dos últimos passos para implementar o aplicativo no SAP-BTP é iniciá-lo. Isso falha devido ao seguinte erro que encontrei nos registros de implementação:
[PollStartAppStatusExecution] [myservicename-srv] 8a3b9a31-4711-4ed2-b8fd-c40c2148b725 [Vie Abr 08 09:09:04 UTC 2022] [ERROR] listen EADDRINUSE: endereço já em uso 0.0.0.0:8080 (STDERR, APP/PROC/WEB)#
Acredito que tenha algo a ver com a forma como inicializo o cap. Como mencionei anteriormente, preciso expor um serviço web rest simples para o qual uso express e seu serviço (app) chama app.get("/meucaminho") para implementar esses métodos rest.
Descobri que CAP pode ser usado junto com express ao usar um custom.js que primeiro instancia um serviço express e depois indica ao cap para usar essa instância personalizada de cap.
Já descobri pelas saídas do console que "process.env.PORT" fornece 8080 e "process.env.HOST" é indefinido.
O trecho de código a seguir está abreviado e mostra apenas as partes relevantes. Portanto, não preste atenção a erros de digitação
?
const express = require('express');const app = express();const cds = require('@sap/cds');const options = {};// mais linhas de código ....
async function cap_bootstrap(o) { await cds.connect.to('db'); await cds.serve.in(app);