I componenti di back-end sono la seconda tipologia di integrazione di cui vogliamo illustrare il funzionamento.
Un componente di back-end è costituito da una libreria di codice JavaScript in grado di interagire con l’ambiente operativo di back-end. Questa libreria può essere integrata come elemento a sé stante, sotto forma di un insieme di file JavaScript, ed in questo caso si tratta solitamente di librerie di calcolo, oppure come pacchetto Node.js, codice che può utilizzare l’intero ambiente Node.js in cui sono in funzione le applicazioni.
Vediamo adesso due esempi di integrazione, partendo dalla libreria word-freq, una libreria di codice JavaScript che calcola la frequenza di parole in un testo, che viene integrata come libreria JavaScript a sé stante. Un esempio funzionante di questa libreria è contenuto nel progetto Extensibility Design Patterns.
Integrazione di una libreria JavaScript #
Per integrare una libreria JavaScript, il primo passo è quello di ottenere un file JavaScript che la contiene. Solitamente si ottiene scaricandolo dal repository GitHub della libreria.
A questo punto occorre inserire la definizione degli oggetti della libreria all’interno di una libreria del progetto di tipo Applicazione. Nel caso di esempio useremo ancora MyAppLibrary.
Per ogni oggetto che si desidera utilizzare dal codice di back-end di Instant Developer Cloud, è necessario creare una classe in cui vengono definiti i metodi e le eventuali proprietà dell’oggetto. Nel caso di WordFreqSync, viene definito il solo metodo process, che, a fronte di un testo, restituisce l’array delle parole marcate con la frequenza relativa.
Infine è necessario caricare il codice JavaScript della libreria all’interno della classe come risorsa di tipo Script server. Il nome di questa risorsa solitamente deve coincidere con il nome della classe, perché quando l’applicazione è in funzione in un server, il framework esegue la seguente riga di codice per ogni risorsa di tipo Script server.
App.[nome-risorsa] = require(“url script server”);
In questo modo il codice della risorsa viene caricato nella sessione e viene assegnato ad una classe che può essere istanziata. Nel caso dell’esempio, la classe WordFreqSync viene usata come segue:
let vv = App.WordFreqSync();
let wordList = vv.process(txt);
Si noti che non esiste un unico metodo per utilizzare gli oggetti derivati dalle librerie JavaScript di back-end, dipende infatti da come la libreria espone i metodi interni all’ambiente esterno. È quindi richiesta la conoscenza dell’ambiente operativo JavaScript e Node.js per avere successo nell’operazione di integrazione.
Quando l’applicazione è in esecuzione locale (modalità “offline”), non è possibile effettuare il require, quindi le risorse di tipo Server script vengono semplicemente caricate nella webview quando l’applicazione è in fase di inizializzazione. Per ottenere una libreria equivalente può essere necessario adattare l’interfaccia. Questo avviene nell’evento onStart tramite il seguente codice:
if (app.runsLocally()) {
App.WordFreqSync = window.WordFreqSync;
delete window.WordFreqSync;
}
Integrazione di un pacchetto Node.js #
L’integrazione di un pacchetto Node.js è la soluzione migliore per aggiungere librerie di back-end che devono essere utilizzate solo nell’ambiente Node.js, cioè quando l’applicazione è in esecuzione in un server.
Il primo passo è identificare il pacchetto che implementa la funzionalità desiderata, solitamente tramite il sito npm. Nel nostro caso utilizzeremo basic-ftp, un client ftp che può servire alla nostra applicazione per interagire con un server ftp di esempio, posto all’indirizzo: https://www.wftpserver.com/onlinedemo.htm.
A questo punto è necessario inserire il pacchetto Node.js nel proprio server, prima di tutto nel server IDE e poi, prima di installare l’applicazione, anche nei server di produzione.
La definizione dei pacchetti da aggiungere ai propri server viene effettuata tramite la console di Instant Developer Cloud, nella pagina Impostazioni del proprio server nella console, come si vede nell’immagine seguente:
Nel campo “Pacchetti npm personalizzati” è necessario aggiungere nome e versione dei pacchetti da caricare nel server, separati da virgole e senza spazi. Siccome il valore precedente del campo era “speakeasy@2.0.0”, per aggiungere il pacchetto basic-ftp è stato modificato in “speakeasy@2.0.0,basic-ftp@4.6.6”.
A questo punto è possibile utilizzare le funzionalità aggiuntive, descritte nella documentazione del pacchetto. È opportuno considerare che le funzioni del pacchetto non possono essere sincronizzate con yield, quindi bisognerà scrivere il codice tramite callback o promise. Per questa ragione è necessaria la conoscenza dell’ambiente operativo Node.js e delle relative tecniche di programmazione asincrone.
Nell’esempio seguente effettuiamo la connessione al server, cambiamo la directory di lavoro in download e poi stampiamo a video la lista dei file.
App.FirstForm.prototype.onLoad = function (options)
{
const ftp = require("basic-ftp");
const client = new ftp.Client();
client.ftp.verbose = false;
//
client.access({
host : "demo.wftpserver.com",
user : "demo",
password : "demo",
secure : false
}).catch (e=>console.error(e))
.then(s=>client.cd("download"))
.then(s=>client.list())
.then(function (s) {
let msg = "";
for (let i = 0; i < s.length; i++) {
msg += s[i].name + "\n";
}
$helloTxt.innerText = msg;
//
client.close();
});
};