Skip to Content
Technical Articles

Sin dolor no hay Gloria – relato de un Guerrero XSA

En mis ultimos blogs de la series en desarrollo de la plataforma #XSA, escribí algunos artículos acerca de módulos de node, OData, entre otros conceptos. Hoy, quiero dar un deep dive en este tema y compartir detalles en como crear REST APIs. Este blog puede leerse en inglés también aquí

 

 

*una diferencia en este blog con mis anteriores es de que en los anteriores use la version SP03, sin embargo en este estoy usando la version SP04. Añado también que estoy tratando de evitar la herramienta XS CLI dado a cabo de que muchos admins no dan acceso a este tipo de herramientas en algunas compañias.

 

Reto 1: habilitar el uso del servicio UAA para autenticar los requests en el modulo de node JS.

Solución: es muy simple. Los pasos iniciales fueron documentatios anteriormente, pero los incluiré aqui de nuevo.

  • Asegúrate de que el archive mta.yaml tenga sus dependencies (html, db, node, uaa) me refiero a que las secciones de requires/provides estén configuradas correctamente
  • Asegúrate que el archive xs-app.json contenga la aunteticidad de tipo “route”, y las rutas actuals
  • Asumiendo que ambos modulos XSJS compatibility y node js sean soportados en el modulo de node, continua y has el bootstrap de estos elementos en el archive server.js

El archive server.js es la entrada principal (y por default es como se inicia desde el archive package.json)

  • Luego, desde el archive server.js, el (modulo express) router llama para analizar el request y eventualmente pasar la ejecución correpondiente.
  • Nota que las rutas definidas en el modulo ui en su archivo xs-app.json debe ser igual que las rutas definidas en el archive index.js del modulo tipo node, de otra manera resultará en http 404 “Not found”

 

Gracias Lucia y Craig por sus ejemplos, me sirvieron y fueron de mucha ayuda.

 

 

  • En el folder (router) el archive index.js arriba, también estamos importando un servicio llamdao demoSvc.js (la implementación del servicio) donde ejecutaremos el sql o las stored procedures (asumiendo que estas hayan sido creadas en el modulo db y que el usuario tenga el acceso correspondiente para ejecutar dichos artefactos). Durante mis ejercicios, yo cree un a tabla cds local, un stored proc e inserté data a la table cds.

Una vez que todo esto estaba en order, era solamente tiempo de ingresar el código nodejs para ejecutar sql o cargar los procedures.

IMO Best practices dicen que temenos que ejecutar la mayor parte de la logica en la BD (usando procedures) pero también quiero ver como funciona la forma de ejecutar SQL desde el modulo node JS – fue muy fácil en mi opinion.

 

Primero que nada, quiero mostrar un request muy simple para agarrar confianza de que se puede llamar y responder desde una ruta definida en el router. Utlizé json debido a que es la forma mas común como las aplicaciones web y servicios se comunican en la actualidad.

 

 

Si tuviste suerte y continuas sin errores, veamos ahora como se llama un SELECT query.

 

  • Nota que el objeto req (contiene una propiedad db que eventualmente se asigna como client) y que es utilizada para ejecutar nuestro sql statement
  • La función prepare toma un sql statement como el primer argumento, y un callback regresa errors & statements
    • El err now hace saber inmediatamente si no tenemos permisos o si hay algún otro error con nuestro query
    • El object statement nos permite ejecutar nuestro query como es mostrado en el siguiente punto
    • La función exec toma un parametron inicial, & un call back, nuevamente, el call back regresa un error y los results (que ATM!!! La data si es que algo regresa del query)
    • Podemos incluir logica adicional para manipular la respuesta antes de regresarla al request, o en mi caso, regresar un objecto custom como respuesta
    • Finalmente, el objecto response (del request original) se configura para que contenga el response type (ya sea json, plain text, binary, file, etc), (http) el status, y luego Podemos regresar el response hacia el invocador de dicho request.
    • Esta es una forma muy simple, elegante y fácil de entender que es lo que esta suciediendo en este request y response. Les sugiero que incluyan una session con el debugger y analyzen los pasos para ver información adicional del req/resp, db, connection, results como otros objects.

 

En el siguiente ejercicio, quiero compartir como ejecutar un stored procedure

  • Para empezar, debemos incluir el modulo @sap/hdbext debido a que nos permitirá cargar el stored procedure
  • La función loadProcedure toma varios argumentos (client, schema, proc name and callback
  • El client es req.db como se muestra en la asignación a la variable, No incluí schema porque lo que usé es mi hdi container, sin embargo, si puedes tratar de usar tu propio schema como el Segundo argumento al llamar la función
  • El nombre proc muestra que hay un object ques es de tipo deisgn time. Copié el nombre después de haberlo ejecutado desde el SQL console. Trata de copiar los nombres y abstente de tratar de escribirlos namespace : : name
  • Nota que el call back esta en formato de ES6, en lugar de node/js vanilla y usa funciones de flechas (las cuales llevan syntax mas corto)
  • nuevamente, el error es el primer argumento y nos notificaría si algo esta incorrecto durante la ejecución de nuestro programa
  • Luego el objecto sp el cual se cargo como función proxy
  • Recuerda que si el stored proc require cualquier input params, tendremos que incluirlos en algun lado antes de dicha ejecución de la función proxy. En mi caso, yo lo pasé como query string params en el request y luego obtengo esos valores del objeto req.query (mi parámetro es “name”)
  • La función proxy ( sp() ) toma un objeto con input params y luego tiene un callback (funciones de flechas en este caso) regresa errors, params o results del mismo proc
  • Eventualmente, configuramos el response, como lo habia mencionado anteriormente, tengo un objeto custom como mi response

 

 

 

 

 

 

Otros issues que me tope en el camino(me tomó tiempo cada uno de ellos por eso pienso que es importante compartirlos)

  • Error debido al syntax en mta.yaml — me equivoque al querer arreglar algo mas. Trata de no editar este archive manualmente
  • Proxy error cuando quise enlazar el route authentication, pasando el auth token del ui hacia el modulo node – tuve que incrementar el tamaño asignado de memoria al app desde el mta.yaml sección bajo parameters en cada modulo (ui y node)
  • Insufficient privileges para ejecutar sql/stored procedure – debes usar el role correcto (o role collection) necesita ser asignado a los usuarios. Yo terminé utilizando una tabla de tipo cds, y un proc de mi hdi en lugar de usar una schema diferente con proposito solo de este blog.
  • En tablas nuevas, necesitas inserter data – este overhead es solo cuando hay que desarrollar algo nuevoy no debe de suceder una vez que te utilizes tables existentes que ya tengan datos
  • El node bootstrap codigo require ciertos modulos @sap los cuales deben ser incluidos – mi error fue de que comente cierto codigo pensando que no se iba a utilizer. Manten todo al inicio y luego ve como es la implementacion para saber si en verdad se va a utilizer o no. Cualquier modulo que no este incluido debe incluirse en el archivo package.json bajo la sección de dependencies y asi como también su número de versión. Si no sabes cual es la versión, intenta “latest” hasta que sepas cual ocupas. No dejes “latest” como tu version pues esto puede quebrar tu aplicación si es que tienes que bajar/instalar el “latest” siempre.
  • Aunque el modulo nodejs corre en su priopio host:port, el request tiene que ser mandado al modulo ui. Te dará un error, unauthorized, si es que tratas de accederlo directamente. En lugar de hacer eso, debes accederlo desde el ui y solo cambiar el path relativo de acuerdo a como lo hayas configurado en el archivo xs-app.json – este archivo se encarga de mandar los requests a donde devan de ir correctamente

 

Una vez que tengas esto bajo control, sera muy bien, ahora si entenderás mas el porque y donde deben de ir las configuraciones. Ahora, sigue Adelante y comparte. Hasme saber si tienes dudas o preguntas. Muchas gracias por leer este blog.

 

creditos:

*Cloud foundry https://www.cloudfoundry.org/

**Express js module https://expressjs.com/en/api.html

***ES6 & arrow functions https://www.w3schools.com/js/js_es6.asp

**** Lucia https://developers.sap.com/tutorials/xsa-xsjs-xsodata.html

***** Craig https://developers.sap.com/tutorials/xsa-node-modules.html

 

 

Be the first to leave a comment
You must be Logged on to comment or reply to a post.