Avalados por :

Como expor um serviço CAP com Express para implementar métodos REST

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

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);    
            
Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

1 Respuestas

0
Cargando...

Olá Comunidade,

Encontrei uma solução para mim mesmo. Agora estou usando os eventos do ciclo de vida acionados pelo CDS. Neste caso especial, estou usando o evento 'listening' no qual no retorno, guardo a instância do express, que o CDS criou implicitamente, em uma variável global e chamo uma função que faz as coisas para as quais quero o express diretamente. Veja o exemplo de código abaixo:

cds.on('listening', () => {
  oApp = cds.app; // oApp está definido globalmente
  main();
}
é claro, também seria possível usar diretamente cds.app em todos os lugares da aplicação em vez de uma variável global 'oApp'.


Saudações, 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?