V7R20


5733OPS : Produits Open Source


 

Node.JS

Le produit peut être téléchargé depuis le site ESS

il s'installe par :

Pour une découverte du langage voyez OpenClassroom

Quelques notions quand même

node.js utilise beaucoup les fonctions, qui peuvent être externalisées :

la fonction doit utiliser exports pour être visible (comme les procédures en RPG)

le module "client" doit utiliser require pour "aller la chercher"


nb : la syntaxe javascript est automatiquement reconnue par RDI




Un pointeur vers une fonction peut être utilisé dynamiquement (comme un pointeur de procédure en RPG)

  exemple, une fonction en tant que paramètre envoyé à une fonction



la fonction test recoit le pointeur vers une fonction (ici nommé param) puis lance la fonction param en mode asynchrone (plus tard dans le code))


Attention

écrivez test(param) > test recoit une variable (de type fonction)

et non test(param() ) > test receverait alors le résultat retourné par la fonction param


Ici le "pointeur" de la fonction est dans une variable, test continue à lancer la fonction qu'il a "reçu".


Elle n'a pas de nom on parle de fonction anonyme.



Enfin une fonction peut-être passée directement en tant que paramètre, on parle de fonction "inline"




Une fonction ayant une fonction en tant que paramètre attend que la fonction "paramètre" soit terminée avant de s'exécuter. On parle alors de fonction asynchrone

C'est aussi une technique évenementielle, la fonction est lancée à chaque fois que la fonction "paramètre" produit un résultat, très pratique pour un serveur http !

Ce concept s'appelle fonction de rappel ou callback.

C'est véritablement une des spécificités de node.js


Particulier, non ?


1er essai : Hello World (en Français)

saisissez ce code (ici par EDTF)

lancez le depuis QSH par :

et testez avec un navigateur


A chaque fois qu'un navigateur se connectera, la fonction inline sera lancée !

ce serveur peut aussi être soumis par


et aurait pu aussi être écrit comme ceci (probablement plus lisible)


ou encore

A chaque connexion, la fonction achaquevisiteur est lancée

 

2eme essai : simple requête SQL



remarquez db.conn qui se fait sur le nom de DataBase (celui indiqué par WRKRDBDIRE) ou *LOCAL

Résultat (ici sous PuTTY)


3eme essai
: requête SQL et serveur HTTP

saisissez ce code


JSON.stringify transforme un objet JSON en chaîne de caractère

 

Soumettons le et testons (ce lien doit lancer lancer la page vue plus haut)

"As Usual", nous aurons sans doutes quelques soucis avec les caractères accentués "latin"


Le connecteur DB2 propose aussi d'autre fonctionnalités, particulièrement sur les métadata (Défintion des tables)



Vous pouvez vous connecter à la base locale, sans profil ni mot de passe (paramètres absents et non vides)


Résultat


Vous pouvez aussi accéder aux objets IBM i par un toolkit basé sur le projet XMLServices.

Exemple, avec une commande système RTVJOBA





Si vous le souhaitez, transformez la valeur en JSON (format plus "naturel" à node.js)

Exemple avec RTVSYSVAL sur notre n° de série




Data contient deux informations : un attribut et une valeur <data desc="QSRLNBR>217D81V</data>

En JSON une série de valeur est défine entre [ et ], c'est alors un objet tableau et non plus une valeur unitaire

Ce code fonctionne





Autre exemple avec un programme



Deux paramètres en entrée

Lancement du pgm, récupération du résultat en XML (par défaut)





Lancement du pgm, transformation en JSON pour dérouler l'arbre



Depuis l'été 2015 (TR2) nous pouvons lancer Node.JS avec la technique FastCGI (celle utilisée par Zend pour PHP)

Il faut charger le module

  LoadModule zend_enabler_module /QSYS.LIB/QHTTPSVR.LIB/QZFAST.SRVPGM

Puis indiquer le pgm à lancer à l'avance en associant un type de fichier à fastcgi

  AddType application/x-httpd-javascript .js
  AddHandler fastcgi-script .js


Enfin, renseignez fastcgi.conf en lui indiquant l'exécutable à lancer :



le serveur lancé, vous devez voir




IBM founi deux modèles dans /QOpenSys/QIBM/ProdData/Node/os400/node-fastcgi

un fichier fastcgi.conf et un script fcgi.js qui ne fait que renvoyer le nom du script passé en paramètre




Attention, si vous utilisez des fichiers à l'extension .js il seront traités par FastCgi

Il faudrait mieux, utiliser une autre extension (.jss dans nos exemples)


Inspirons nous du script fourni par IBM :

  1. remplacons .jss par .js
  2. cherchons si le fichier transmis dans l'URL existe
  3. Si oui, lancons une fonction process dans ce dernier




Avec cet exemple


et le fchier httpd.conf modifié

  AddType application/x-httpd-javascript .jss
  AddHandler fastcgi-script .js
s

cela donne


Deuxième partie : Python

Le produit peut toujours être téléchargé depuis le site ESS

il s'installe par :

 

La PTF SI58191 est impérative, elle corrige un certain nombre de problèmes de connexion à DB2. Suite à cette PTF il faut passer :

  easy_install3 /QOpenSys/QIBM/ProdData/OPS/Python-pkgs/ibm_db/ibm_db-2.0.5.2-py3.4-os40 0-powerpc.egg                                                            

Vous pouvez aussi installer par pip (aujourd'hui, c'est LA méthode conseillée)

Connecteur DB2 :
    pip3 install /QOpenSys/QIBM/ProdData/OPS/Python-pkgs/ibm_db/ibm_db-*-cp34m-*.whl

Django:

    pip3 install --no-deps /QOpenSys/QIBM/ProdData/OPS/Python-pkgs/ibm_db/ibm_db_django-*-py3-*.whl

le IBM i Toolkit:
    pip3 install /QOpenSys/QIBM/ProdData/OPS/Python-pkgs/itoolkit/itoolkit-*-cp34m-*.whl

FAstCGI :
    pip3 install /QOpenSys/QIBM/ProdData/OPS/Python-pkgs/flipflop/flipflop-*-py34-*.whl

Llightweight web framework:
    pip3 install /QOpenSys/QIBM/ProdData/OPS/Python-pkgs/bottle/bottle-*-py34-*.whl

Si vous avez des problèmes de code page (UnicodeDecodeError: 'utf-8' codec can't decode byte 0xnn), vous avez un problème de LOCALE

Passez avant, les commandes :

   export LC_ALL="fr_FR.UTF-8"
   LANG="fr_FR.UTF-8"      


Premier exemple : un mini serveur web (Python est un bon langage pour faire du CGI)

Pour un analyseur syntaxique de Python, voyez Pydev.org

Sous RDI, lancer Aide/installer un nouveau logiciel

Ajoutez un site d'installation


Acceptez la licence




En Python il n'y a pas d'accolade, un bloc (fonction, boucle, ...) commence par : et tant que le code est en retrait il appartient au bloc

L'indentation est obligatoire !

Encore une fois, nous vous conseillons le site OpenClassroom pour découvrir le langage

lancons le script




Exemple2 : affichage d'une page statique (mapage.html, externe)



ici, nous devons préciser le contexte "/test" à cause de @route('/test')


Exemple3 : Utilisation d'un formulaire


remarquez les importations (import)


la page contenant le formulaire (notez le contexte /question) et la réponse (/reponse)

->



Résultat


Pour plus de détail voyez le connecteur DB2 pour Python.

Exemple (RTVJOBA)




En mode Web

A aujourd'hui (et comme souvent) nous avons des problèmes avec le code page 297.


Mais après CHGJOB CCSID(37)




Pour plus de détails, voyez le Toolkit python, toujours base sur le projet XMLSERVICE


Nous pouvons aussi utiliser fastcgi avec Python (Voyez un exemple FastCGI sur http://yips.idevcloud.com/wiki/index.php/FastCGI/Python )

Avec le code fourni sur ce site

  1. cherchons si le fichier transmis dans l'URL existe
  2. Si oui, lancons le fichier et retournons le résultat



Il faut toujours charger le module

  LoadModule zend_enabler_module /QSYS.LIB/QHTTPSVR.LIB/QZFAST.SRVPGM

Puis indiquer le pgm à lancer à l'avance en associant un type de fichier à fastcgi

  AddType application/x-httpd-python .py
  AddHandler fastcgi-script .py


Enfin, renseignez fastcgi.conf en lui indiquant l'exécutable à lancer :



Et voilà !


exemple SQL, toujours avec fastCGI




Voyez aussi les options apparues en 7.3 ou par Technology Refresh

©AF400