Le produit peut être téléchargé depuis le site ESS
il s'installe par :
suite à l'installation du produit, vous devez trouver ces répertoires
pour éviter l'erreur signal 5, vous devez aussi créer la variable d'environnement QIBM_MULTI_THREADED à 'Y'
enfin vous pouvez tester par QSH ou QP2TERM (PASE)
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 :
Avec cet exemple
et le fchier httpd.conf modifié
AddType application/x-httpd-javascript .jss
AddHandler fastcgi-script .jss
cela donne
Le produit peut toujours être téléchargé depuis le site ESS
il s'installe par :
suite à l'installation du produit,et de la PTF SI57008, vous devez trouver ces répertoires
Testez
La PTF
SI57253 apporte le connecteur DB2 qu'il faut ensuite installer par :
easy_install3 /QOpenSys/QIBM/ProdData/OPS/Python-pkgs/ibm_db/ibm_db-*.egg
La PTF
SI57254 apporte le Toolkit, qu'il faut ensuite installer par :
easy_install3 /QOpenSys/QIBM/ProdData/OPS/Python-pkgs/itoolkit/itoolkit-*.egg
La PTF
SI57255 apporte une passerelle FastCGI, nommé flipflop
eeasy_install3 /QOpenSys/QIBM/ProdData/OPS/Python-pkgs/flipflop/flipflop-*.egg
Enfin PTF
SI57256 apporte un framework Web : Bottle
easy_install3 /QOpenSys/QIBM/ProdData/OPS/Python-pkgs/bottle/bottle-*.egg
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 : Django: pip3 install --no-deps /QOpenSys/QIBM/ProdData/OPS/Python-pkgs/ibm_db/ibm_db_django-*-py3-*.whl le IBM i Toolkit: FAstCGI : Llightweight web framework: |
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
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
La version de wget livrée ne permet pas d'utiliser des serveurs via https. Si cela est utile, mettez à jour WGET, par : $ wget http://www.oss4aix.org/download/RPMS/wget/wget-1.16-1.aix5.1.ppc.rpm |
Cette commande permet d'isoler l'exécution d'un programme et d'éviter ainsi la compromission complète lors de tests. Elle n'est pas compatible QSH (Pase Uniquement)
Voyez aussi les options apparues en 7.3 ou par Technology Refresh