Domino e node.js: primi passi (parte 3)

Prosegue qui il nostro cammino nel setup ed uso di node.js con Domino 10.

Se vi siete persi gli articoli precedenti potete trovarli qui : parte 1 e parte 2 .

Vi consiglio di leggerli prima di proseguire in quanto i primi punti sono necessari per iniziare a crearsi l’ambiente. Questo articolo parte già dal punto cinque.

(Questo articolo è il terzo di una serie, aggiorneremo i link man mano che procederemo alla pubblicazione di tutto.).

 

5.Il codice in node.js

A questo punto, con tutti i componenti al loro posto, ho iniziato a fare dei test con node.js per provarne alcuni aspetti.

Avevo già un database di esempio con circa 19.000 documenti: si tratta di un set di dati pubbici scaricati dal sito della Regione Lombardia con l’elenco delle strutture ricettive della Lombardia e che avevo usato per testare il DQL da LotusScript .

Quello che volevo fare era interrogarlo da node.js per visualizzare i risultati per provincia.

Sono partito dall’ottimo esempio di Oliver Busse (https://oliverbusse.notesx.net/hp.nsf/blogpost.xsp?documentId=2E52) , giusto per non dover scrivere il codice da zero da questo punto mi sono cimentato.

 

Innanzitutto vediamo come dichiarare la connessione al server da node.js:

// domino-db
const {
    useServer
} = require('@domino/domino-db');

// certificati
const fs = require('fs');
const path = require('path');
const readFile = fileName => {
  try {
    return fs.readFileSync(path.resolve(fileName));
  } catch (error) {
    console.log("Errore leggendo " + fileName);
    return undefined;
  }
};
const rootCertificate = readFile('ca.crt');
const clientCertificate = readFile('app1.crt');
const clientKey = readFile('app1.key');

// proton config
const serverConfig = {
    "hostName": "xxxxx.yyyyyy.it",
    "connection": {
        "port": 3002,
        secure: true,
    },
      credentials: {
    rootCertificate,
    clientCertificate,
    clientKey,
  },
};

La prima parte (domino-db) richiama il modulo domino-db che era nell’AppDevPack e che era stato installato precedentemente.

Poi abbiamo la parte dei certificati dove leggo i tre file necessari alla connessione e che ho precedentemente creato al punto 4 : ca.crt è il root certificate, gli altri due sono quelli relativi all’utenza app1 (per cui ho anche creato il documento persona nel NAB).

Infine la parte proton config dove viene dichiarata la connessione al server come secure e gli vengono passati i tre files con certificati e key .

La porta 3002 l’avevamo configurata al punto 2.

Un consiglio per non impazzire : nel notes.ini dichiarate che proton accetta connessioni da tutti i server con la variabile

PROTON_LISTEN_ADDRESS=0.0.0.0

Giusto per evitare errori imprevisti , siete sempre in tempo a raffinarla dopo.
Ovviamente tutti i nomi di utenza e server devono avere perfetta corrispondenza fra quanto dichiarato nella fase di creazione dei certificati , quanto riportato nel NAB e quello che viene scritto nel codice.

A questo punto node.js dovrebbe essere in grado di connettersi al server e con questa istruzione possiamo istruirlo sul file Notes da usare:

// domino nsf
const databaseConfig = {
"filePath": "node/struct.nsf"
};

Poi c’e’ l’istruzione per la query:

var query = "PROVINCIA = 'VA'"

ma se avete già visto DQL questa vi viene naturale.

Ed infine una variabile

const maxCount = 200;

che determina il numero massimo di risultati che la query può ritornare .

Qui purtroppo c’è quello che secondo me è attualmente un punto dolente : il valore 200 per il maxCount non è stato preso a caso ma è il valore massimo che il modulo domino-db può ritornare.

In altre parole se la query ritorna più di 200 valori domino-db (tramite la chiamata bulkReadDocuments ) ne ritorna solo 200 !

Se quindi prevediamo di avere più di 200 documenti dovremo gestirli tramite il codice node.js ed il parametro start che indica a bulkReadDocuments da quale posizione partire :

        const docs = await database.bulkReadDocuments({
           query: query,
           count: count,
           start: 400,
           itemNames: ["CAP", "NOME_COMUNE", "DENOMINAZIONE_STRUTTURA", "INDIRIZZO"]
        });

Altra cosa da tenere a mente è la dichiarazione dei campi (itemNames) che vogliamo siano restituiti dalla query , non c’e’ un default e se la omettiamo non torna nulla.

 

Il risultato di tutto questo lo potete vedere , al momento, all’indirizzo http://posta.eldeng.it:8080/