IBM Cloud Docs
Sviluppo di un'applicazione Web

Sviluppo di un'applicazione Web

Questa esercitazione ti mostra come creare una semplice galleria di immagini utilizzando IBM Cloud® Object Storage, unendo molti concetti e pratiche differenti chiave per lo sviluppo Web.

Dall'inizio alla fine, la creazione di un'applicazione web copre molti concetti differenti ed è un ottimo modo di fare esperienza con le funzioni di IBM Cloud Object Storage. La tua applicazione usa IBM Cloud Object Storage per l'archiviazione in un'applicazione Node.js che permette a un utente di caricare e visualizzare file di immagini JPEG.

Lo scenario

Lo scenario per questa esercitazione coinvolge molte parti mobili:

  • Un server Web per ospitare l'applicazione Web
  • Uso della riga di comando
  • Un'istanza di archiviazione per le immagini nella galleria
  • Un sistema di controllo della versione integrato nella fornitura continua
  • Bind dell'applicazione lato client in entrambi gli script e markup
  • Immagini da caricare e visualizzare

E se stai cercando tutto questo in un unico pacchetto, questo tutorial ti fornirà un esempio completo, da inizio a fine, per te. Tuttavia, questa istruzione può solo temporaneamente mettere da parte i principi di sicurezza e codice sicuro. Le applicazioni web effettivamente messe in produzione richiedono una sicurezza adeguata, o non saranno adatte per i possibili visitatori.

Prima di iniziare

Assicurarsi di disporre di quanto necessario per iniziare:

  • Un account per la piattaforma IBM Cloud
  • Docker, come parte di IBM Cloud Developer Tools
  • Node.js
  • Git (sia su desktop che a riga di comando)

Utilizzo della riga di comando

Inizia aprendo uno strumento familiare agli sviluppatori esperti e un nuovo migliore amico per quelli che hanno appena iniziato: la riga di comando. Per molti, la GUI (graphic user interface) ha relegato la CLI del computer allo stato di seconda classe. Ma ora, è il momento di riportarlo indietro (anche se la GUI non sta andando via in qualsiasi momento presto, soprattutto quando è necessario sfogliare il web per scaricare le istruzioni per la serie di strumenti della riga di comando).

Aprire una shell e creare una directory. Cambiare la propria directory di riferimento con la nuova creata. Una volta creata, l'applicazione ha una propria sottodirectory con il codice di partenza e la configurazione necessaria per iniziare a funzionare.

Lascia la riga di comando e ritorna al browser in modo da poter seguire le istruzioni per installare IBM Cloud Platform developer tools al collegamento. Gli Developer Tools offrono un approccio estensibile e ripetibile alla creazione e alla distribuzione di applicazioni cloud.

Installazione di Docker

L'utilizzo dei contenitori, come Docker, accelera lo sviluppo e facilita il test e supporta la distribuzione automatica. Un contenitore è una struttura leggera che non ha bisogno di un sistema operativo, ma solo del codice e della configurazione di tutto, dalle dipendenze alle impostazioni.

Docker è installato come parte di Developer Toolse ne hai bisogno. Il suo lavoro si svolge principalmente in background all'interno delle routine che affacciano la tua nuova app. Affinché i comandi di build funzionino è necessario che Docker sia in esecuzione. Create un account Docker online su Docker hub, eseguite l'applicazione Docker e accedete.

Installazione di Node.js

L'applicazione costruita utilizza Node.JS come motore lato server per eseguire il codice JavaScript di questa applicazione web. Per usare il gestore di pacchetti Node (npm) per gestire le dipendenze della propria applicazione, è necessario installare Node localmente. Inoltre, un'installazione locale di Node semplifica i test, accelerando lo sviluppo.

Prima di iniziare, è possibile considerare un gestore versioni, come Node Version Manager o nvm, per installare Node. Un gestore versioni riduce la complessità di gestione delle varie versioni di Node.js.

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

...o 'wget (è necessario solo uno dei due, ma non entrambi; utilizzate quello disponibile sul vostro sistema):

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

Oppure, per Windows, potete usare 'nvm per Windows con gli installatori e il codice sorgente al link.

Utilizzando nvm, installare Node.

nvm install v6.17.1

Qualsiasi approccio utilizzi dopo aver installato Node.js e npm (incluso con Node) sul tuo computer, congratulati per un lavoro ben avviato!

Installazione di Git

Probabilmente hai già familiarità con Git, in quanto è il sistema di controllo delle versioni del codice sorgente più utilizzato. Si usa Git in seguito, quando si crea una catena di strumenti per la distribuzione continua (CD) nella piattaforma IBM Cloud Per la consegna e la distribuzione continua. Se non avete un account GitHub, create un account personale pubblico e gratuito sul sito web di GitHub; altrimenti, accedete pure con qualsiasi altro account in vostro possesso.

Devi generare e caricare le chiavi SSH nel tuo profiloGitHub per l'accesso sicuro a GitHub da riga di comando. Tuttavia, fare ciò ora fornisce una buona pratica, poiché ripeti la procedura per l'istanza di GitHub utilizzata per la piattaforma IBM Cloud in seguito.

Per ora, scarica il desktop diGitHub ed esegui il programma di installazione. Al termine del programma di installazione, accedi a GitHub con il tuo account.

Immettere un nome e un'email (visualizzati pubblicamente) per tutti i commit nel repository. Una volta che l'applicazione è collegata al tuo account, ti potrebbe essere richiesto di verificare la connessione dell'applicazione tramite il tuo account GitHub online.

finestra di accesso aGitHub Desktop
github_desktop_setup

Creazione dell'applicazione starter Node.js

Per iniziare a sviluppare la vostra applicazione in locale, iniziate ad accedere alla piattaforma 'IBM Cloud direttamente dalla riga di comando, come mostrato nell'esempio. Puoi specificare parametri facoltativi, come la tua organizzazione con l'opzione -o e lo spazio con l'opzione -s. Se si utilizza un account federato, utilizzare '--sso.

ibmcloud login

Immettere il comando come mostrato per scaricare e installare l'estensione CLI utilizzata in questa esercitazione.

ibmcloud cf install

Quando effettui l'accesso, ti potrebbe essere richiesto di scegliere una regione. Per questo esercizio, selezionare us-south come regione, poiché la stessa opzione viene utilizzata per creare una toolchain CD più avanti in questa esercitazione.

Successivamente, impostare l'endpoint (se non è già impostato). Altri endpoint sono possibili e potrebbero essere preferibili per l'utilizzo in produzione. Per il momento, utilizzare il codice come mostrato, se appropriato per il proprio account.

ibmcloud api cloud.ibm.com

Quindi, creare un'applicazione web. Lo spazio dev è un'opzione predefinita per la tua organizzazione, ma potresti preferire crearne altri per isolare diversi sforzi. Ad esempio, tenere "finanza" separata da "sviluppo".

ibmcloud dev create

Con questo comando, ti vengono poste una serie di domande. È possibile tornare indietro in molti punti del processo, quindi se ci si sente persi è possibile ricominciare eliminando la directory esistente e creando una nuova directory. Anche quando crei la tua applicazione sulla riga di comando, vedrai ancora i risultati nella tua console IBM Cloud.

Notare l'opzione per la creazione di una 'Web App'. E'quello che vuoi.

===============================================================================
Select an application type:

 1. Backend Service / Web App
 2. Mobile App
-------------------------
 0. Exit

===============================================================================
? Enter selection number:> 1

Sono fornite diverse opzioni, ma si desidera 'Node'. Immetti '4' e premi Invio.

===============================================================================
Select a language:

 1. Go
 2. Java - MicroProfile / Java EE
 3. Java - Spring
 4. Node
 5. Python - Django
 6. Python - Flask
 7. Swift
-------------------------
 0. Return to the previous selection

===============================================================================
? Enter selection number:> 4

Dopo aver effettuato la selezione per il linguaggio di programmazione e il framework, la selezione successiva avrà così tante opzioni che potrebbe scorrere oltre il servizio desiderato. Come puoi vedere nell'esempio, desideri utilizzare una semplice applicazione web Node.js con Express.js. Immettere '3' e premere Invio.

===============================================================================
Select a Starter Kit:

APPSERVICE
-------------------------------------------------------------------------------

 1. Node-RED - A starter to run the Node-RED open-source project on
    IBM Cloud.

 2. Node.js + Cloudant - A web application with Node.js and Cloudant

 3. Node.js Express App - Start building your next Node.js Express
    app on IBM Cloud.


WATSON
-------------------------------------------------------------------------------

 4. Natural Language Understanding Node.js App - Use Watson Natural
    Language Understanding to analyze text to help you understand its
    concepts, entities, keywords, sentiment, and more.

 5. Speech to Text Node.js App - React app using the Watson Speech to
    Text service to transform voice audio into written text.

 6. Text to Speech Node.js App - React app using the Watson Text to
    Speech service to transform text into audio.

 7. Visual Recognition Node.js App - React app using the Watson
    Visual Recognition service to analyze images for scenes, objects, text,
    and other subjects.

-------------------------
 0. Return to the previous selection

===============================================================================
? Enter selection number:> 3

L'opzione più difficile per gli sviluppatori ovunque è ancora richiesta: denominare la tua applicazione. Seguire l'esempio e immettere webapplication, quindi premere Invio.

? Enter a name for your application> webapplication

In seguito, è possibile aggiungere tutti i servizi, come data store o funzioni di calcolo, necessari o desiderati attraverso la console web. Tuttavia, digitare ' n' per no quando viene chiesto se si desidera aggiungere i servizi ora. Inoltre, se non hai già impostato un gruppo di risorse, potresti ricevere una richiesta in questo momento. È possibile ignorare questa operazione immettendo ' n' a questa richiesta.

Using the resource group Default (default) of your account

? Do you want to select a service to add to this application? [Y/n]> n

Un modo per gestire un'applicazione containerizzata è il software di orchestrazione, come Kubernetes, che è uno standard de facto nello sviluppo.

Digitare '4' e premere invio per utilizzareIBM DevOps' per integrare CD nel ciclo di vita del progetto.

===============================================================================
Select from the following DevOps toolchain and target runtime environment
options:

 1. IBM DevOps, deploy to Knative-based Kubernetes containers
 2. IBM DevOps, deploy to Helm-based Kubernetes containers
 3. IBM DevOps, deploy to Helm-based Red Hat OpenShift containers
 4. No DevOps, with manual deployment

===============================================================================
? Enter selection number:> 4

È necessario scegliere una regione per la toolchain CD di distribuzione automatizzata. Selezionare l'opzione che fa riferimento alla stessa regione scelta in precedenza, '5'.

--------------------------------------------------------------------------------
Select a region for your toolchain from the following options:
--------------------------------------------------------------------------------
 1. eu-de (Frankfurt)
 2. eu-gb (London)
 3. jp-tok
 4. us-east (Washington DC)
 5. us-south (Dallas)
--------------------------------------------------------------------------------
 0. Return to the previous selection
--------------------------------------------------------------------------------
? Enter selection number:> 5

La creazione di una nuova applicazione ci ricorda che la toolchain utilizzata per distribuire la tua applicazione necessita di una configurazione aggiuntiva. Come già detto, il caricamento della chiave pubblica su 'GitHub (nell'istanza di CD Toolchain sulla piattaforma 'IBM Cloud ) è necessario per fornire l'applicazione distribuita utilizzando 'GitHub.

Note: For successful connection to the DevOps toolchain, this machine
must be configured for SSH access to your IBM Cloud GitLab account at
https://git.cloud.ibm.com/profile/keys in order to download the
application code.

Ulteriori richieste confermano il nome dell'applicazione e della catena di strumenti definiti in precedenza. L'esempio mostra come modificare i nomi degli host e delle catene di strumenti, se lo si desidera. Il nome host deve essere univoco per l'endpoint del servizio della tua applicazione, ma escludendo un conflitto, puoi semplicemente premere Invio quando ti viene richiesta la conferma.

The DevOps toolchain for this app will be: webapplication
? Press [Enter] to accept this, or enter a new value now>


The hostname for this app will be: webapplication
? Press [Enter] to accept this, or enter a new value now>

The app webapplication has been created in IBM Cloud.

DevOps toolchain created at
https://cloud.ibm.com/devops/toolchains/6ffb568a-e48f-4e27-aed0-00ca931dde66?env_id=ibm:yp:us-south

Se si copia e incolla il collegamento restituito dal comando ibmcloud dev create, è anche possibile accedere alla toolchain CD. È possibile accedervi dalla console in un secondo momento, nel caso in cui non si sia riusciti a catturare il link. Ulteriori informazioni seguono, mentre il processo continua a creare le voci dell'applicazione in linea, così come una directory con il codice di esempio.

Cloning repository
https://git.cloud.ibm.com/Organization.Name/webapplication...
Cloning into 'webapplication'...
remote: Counting objects: 60, done.
remote: Compressing objects: 100% (54/54), done.
remote: Total 60 (delta 4), reused 0 (delta 0)
Receiving objects: 100% (60/60), 50.04 KiB | 1.52 MiB/s, done.
Resolving deltas: 100% (4/4), done.
OK

The app, webapplication, has been successfully saved into the
current directory.

Quest'ultima affermazione significa che se si visualizza la directory corrente, ora è visibile una nuova sottodirectory " webapplication. Questa directory contiene un'impalcatura della nuova applicazione Node.js. Tuttavia, anche se la ricetta potrebbe essere presente, gli ingredienti stessi sono ancora racchiusi in un'immagine Docker e devono essere combinati. Docker è in esecuzione sulla macchina locale come conseguenza dell'installazione, ma se è necessario riavviarlo, fatelo. Se crei la tua nuova applicazione web senza l'esecuzione di Docker non riesce, ma questo non è l'unico errore possibile. In caso di problemi, controllare i messaggi di errore risultanti, che potrebbero contenere il link appropriato per visualizzare i registri dei risultati nel portale online per il proprio account IBM Cloud Della piattaforma.

ibmcloud dev build

Ora che l'applicazione è creata, puoi eseguire il codice localmente con il comando run. Al termine, copiare e incollare l'URL fornito nella barra degli indirizzi del browser, in genere 'http://localhost:3000.

ibmcloud dev run

Ora che la tua applicazione è stata creata e definita, visualizzala per confermare che funzioni. Se si vede l'immagine segnaposto come mostrato nella Figura 2, ben fatto! Avete creato una nuova applicazione web Node.js e siete pronti a distribuirla nel cloud.

Nuova applicazione Node.js!
applicazione node iniziale

Distribuire l'applicazione sulla piattaforma IBM Cloud con il comando "code1" (come mostrato nell'esempio) Con il comando 'deploy (come mostrato nell'esempio).

ibmcloud dev deploy

L'URL viene nuovamente visualizzato da ibmcloud dev deploy in base all'endpoint regionale e al nome host specificato in precedenza. Puoi visualizzare i collegamenti ai log archiviati nella tua piattaforma IBM Cloud. Procedi e visita la tua nuova applicazione web nel cloud!

Creazione dell'app Galleria Web

Ricordiamo i prerequisiti necessari per sviluppare un'applicazione Node.js su IBM Cloud Piattaforma. Hai già creato il tuo account IBM Cloud Platform ed installato Developer Tools, che hanno installato Docker. Quindi, hai installato Node.js. L'ultimo elemento elencato come prerequisito per questa esercitazione è stato Git, in cui ti immergerai ora.

Inizieremo le specifiche di lavoro sulla galleria di immagini in Node.js. Per ora, utilizza GitHub Desktop per questo scenario, ma potresti anche utilizzare il client della riga di comando Git per completare le stesse attività. Per iniziare, clonare un modello iniziale per la nuova applicazione web.

Seguire questo processo:

  1. Scaricare l'esempio qui: download. Scaricate il modello della vostra applicazione nell'ambiente di sviluppo locale usando il browser. Invece di clonare l'applicazione di esempio dalla piattaforma IBM Cloud Utilizzare il comando dell'esempio per ottenere il modello di partenza per l'applicazione IBM Cloud Object Storage Galleria Web. Dopo aver clonato il repository troverai l'applicazione starter nella directory COS-WebGalleryStart. Apri una finestra Git CMD e passa a una directory in cui vuoi clonare il repository Github. Una volta lì, utilizzare il comando mostrato nel primo esempio di questa esercitazione per iniziare ad aggiungere i nuovi file.

    curl images/image-gallery-tutorial.zip -o image-gallery-tutorial.zip
    
  2. Esegui l'applicazione localmente. Aprire il terminale e modificare la directory di lavoro in COS-WebGalleryStart directory. Nota le dipendenze Node.js elencate nel file package.json. Scaricarli sul posto utilizzando il seguente comando.

    npm install
    
  3. Esegui l'applicazione utilizzando il comando mostrato.

    npm start
    

    Aprite un browser e visualizzate la vostra applicazione all'indirizzo e alla porta che viene inviata alla console, 'http://localhost:3000.

    Per riavviare l'applicazione in locale, si deve uccidere il processo del nodo (Ctrl+C) per arrestarlo e utilizzare nuovamente 'npm start. Utilizzando nodemon invece riavvia l'applicazione quando rileva una modifica e ti fa risparmiare tempo. Installare globalmente 'nodemon in questo modo: npm install -g nodemon. Eseguitelo dalla riga di comando nella cartella dell'applicazione utilizzando: nodemon, per avviare l'applicazione.

  4. Prepara l'applicazione per lo sviluppo. Aggiornare il valore della proprietà "application name" nel file " manifest.yml di COS-WebGallery, con il nome inserito per la propria applicazione su IBM Cloud E le altre informazioni come mostrato nell'esempio, se necessario. L'applicazione manifest.yml è simile al seguente esempio. È possibile personalizzare il file 'package.json che si trova nella cartella principale dell'applicazione con il nome dell'applicazione e il proprio nome come autore.

    applications:
    - path: .
      memory: 256M
      instances: 1
      domain: us-south.cf.appdomain.cloud
      name: webapplication
      host: webapplication
      disk_quota: 1024M
      random-route: true
    

    Ora è il momento in cui potrebbe essere necessario impostare le chiavi SSH per inviare interattivamente il codice all'origine remota. Se si imposta una passphrase per la chiave SSH, è necessario inserire questo codice ogni volta che si inviano le modifiche all'origine remota del repository.

  5. Rimuovere e sostituire il contenuto della cartella 'webapplication con il contenuto della cartella modificata, 'COS-WebGalleryStart. Utilizzando le tue competenze Git ottimizzate, aggiungi i file che sono stati eliminati e aggiunti al repository con la CLI o Github Desktop. Successivamente, esegui il push delle modifiche all'origine del repository. In futuro, potrete apportare modifiche alla vostra applicazione web basata sul cloud semplicemente inviando le modifiche a Git. La toolchain CD riavvia automaticamente il processo del server dopo aver clonato le modifiche e averle depositate sul server.

In sostanza, avete ricodificato la vostra applicazione, quindi ripetete il processo di compilazione. Ma questa volta utilizzate il nuovo codice della Galleria immagini.

Distribuisci l'applicazione a IBM Cloud Platform.

Per ottenere l'applicazione iniziale con le modifiche apportate alla piattaforma IBM Cloud Si può distribuire utilizzando gli Developer Tools, ripetendo gli stessi passaggi eseguiti in precedenza.

  1. Se non l'avete ancora fatto, o se avete riavviato o vi siete disconnessi, accedete alla IBM Cloud Utilizzando il comando 'login.

    ibmcloud login
    
  2. Imposta l'endpoint API per la tua regione utilizzando il comando api.

    ibmcloud api cloud.ibm.com
    
  3. Costruire l'applicazione per la consegna dell'applicazione con il comando build (come nell'esempio).

    ibmcloud dev build
    
    1. Continua e verifica l'applicazione localmente. Ciò consente di eseguire lo stesso codice localmente con il comando run.
    ibmcloud dev run
    
  4. Distribuisci l'applicazione alla piattaforma IBM Cloud con il comando deploy.

    ibmcloud dev deploy
    

    Il codice mostra la sequenza di comandi utilizzati in questo esempio per costruire, testare e distribuire l'applicazione web iniziale.

    ibmcloud login --sso
    ibmcloud api cloud.ibm.com
    ibmcloud target --cf
    ibmcloud dev enable
    ibmcloud dev build
    ibmcloud dev run
    ibmcloud dev deploy
    

    Una volta terminato il processo, la piattaforma IBM Cloud riporta che l'app è stata caricata, distribuita e avviata correttamente. Se si è connessi anche alla console web della piattaforma IBM Cloud, si riceve una notifica sullo stato della propria applicazione. Ma, cosa più importante, puoi verificare che l'applicazione è stata distribuita visitando l'URL dell'applicazione segnalato da IBM Cloud Platform con un browser o dalla console web facendo clic sul pulsante View App.

    Verifica l'applicazione. La modifica visibile dal template dell'applicazione predefinito che era stato distribuito alla creazione dell'applicazione starter mostrata in seguito, dimostra che la distribuzione dell'applicazione a IBM Cloud Platform ha avuto esito positivo.

    Risultati della visualizzazione dell'applicazione distribuita.
    ' '

Crea un ramo Git

Ora, devi creare un ramo per l'ambiente di sviluppo locale da utilizzare con la tua fase di build di IBM Cloud Platform Delivery Pipeline:

  1. Se si utilizza GitHub Desktop, fare clic sull'icona del ramo; viene richiesto di inserire un nome per il ramo. Questo esempio utilizza 'local-dev come nome.

    Utilizzare GitHub Desktop per creare un ramo dev locale
    ' '

  2. Dopo aver creato il ramo, GitHub confronta i file locali sul ramo Local-dev con i file del repository sul ramo predefinito e segnala Nessuna modifica locale. Puoi ora fare clic su Publish per aggiungere il ramo creato sul tuo repository locale al tuo repository GitHub (come mostrato nella figura 5).

    Pubblicare il proprio ramo git sull'origine remota del proprio repo
    ' '

Ora che il ramo Local-dev è stato pubblicato nel repo 'GitHub della vostra catena di strumenti, lo stadio di compilazione della vostra piattaforma 'IBM Cloud 'Delivery Pipeline verrà attivato, seguito dallo stadio di distribuzione, ogni volta che vi si invia un commit. Non è necessario distribuire l'applicazione dalla CLI, poiché la distribuzione è stata integrata direttamente nel flusso di lavoro.

Impostazione delle credenziali di archiviazione

Devi configurare le credenziali Object Storage per la tua applicazione web, nonché un 'bucket' dove saranno archiviate e richiamate le immagini. La chiave API che verrà creata avrà bisogno delle credenziali HMAC di 'Object Storage, definite da 'Credenziali di servizio. I termini " access_key_id e " secret_access_key possono essere riconosciuti come un account AWS e un file di credenziali che contiene già le voci " aws_access_key_id e " aws_secret_access_key.

Dopo aver completato la creazione di una chiave API, scaricato e copiato le credenziali HMAC, completa la seguente procedura:

  1. Nell'ambiente di sviluppo locale, inserire le credenziali nel percorso Windows %USERPROFILE%\\.aws\\credentials. Per gli utenti Mac/Linux, le credenziali devono essere inserite in ~/.aws/credentials). L'esempio mostra il contenuto di un tipico file di credenziali.

    [default]
    aws_access_key_id = {access_key_id}
    aws_secret_access_key = {secret_access_key}
    
  2. Nella pagina web dell'applicazione creata utilizzando il comando CLI sulla piattaforma IBM Cloud Definire le credenziali necessarie come variabili d'ambiente secondo le migliori pratiche di sviluppo, accedendo alla piattaforma IBM Cloud E selezionare la propria applicazione, 'webapplication. Dalle schede, fare clic su Runtime.

  3. Nella finestra Runtime, fare clic su Variabili d'ambiente all'inizio della pagina e scorrere fino alla sezione Definiti dall'utente, che consente di aggiungere le variabili.

  4. Aggiungete due variabili: una con il valore del vostro 'access_key_id, usando 'AWS_ACCESS_KEY_ID come nome della chiave, e un'altra con il valore della vostra chiave di accesso segreta, chiamata 'AWS_SECRET_ACCESS_KEY. Queste variabili e i loro rispettivi valori sono utilizzati dall'applicazione per l'autenticazione con l'istanza di Object Storage quando eseguita su IBM Cloud Platform (vedi la figura 6). Quando hai terminato con le voci, fai clic su Save e IBM Cloud Platform riavvierà automaticamente l'applicazione al tuo posto.

    Variabili dell'ambiente di runtime definite per la propria applicazione
    ' '

Successivamente, oltre al Object Storage Portal per la tua istanza del servizio, aggiungi un bucket per contenere le tue immagini. Questo scenario utilizza il bucket denominato 'web-images.

Personalizza la tua applicazione web Node.js IBM Cloud Object Storage Image Gallery

Poiché questo esempio utilizza un'architettura MVC, la modifica della struttura di directory nel tuo progetto per rispecchiare questa architettura è conveniente nonché una procedura consigliata. La struttura delle cartelle prevede una cartella views per contenere i modelli di vista EJS, una cartella routes per contenere le rotte express e una cartella 'controllers per inserire la logica del controllore. Posizionate questi elementi in una cartella sorgente madre denominata " src (vedi Figura 7).

Struttura del codice sorgente per l'applicazione
Struttura della directory

Suggerimento: il repo che hai clonato in precedenza contiene una directory denominata COS-WebGalleryEnd. La visualizzazione del codice di origine dell'applicazione completata nel tuo editor preferito potrebbe essere utile quando segui le prossime fasi. Questa è la versione del vostro 'webapplication che viene impegnata e distribuita sulla piattaforma IBM Cloud Quando si completa questa esercitazione.

Progettazione dell'applicazione

Esistono due attività principali che un utente dovrebbe poter effettuare con l'applicazione web della galleria di immagini semplice:

  • Caricare le immagini da un browser web nel bucket Object Storage.
  • Visualizzare le immagini nel bucket Object Storage in un browser web.

La seguente procedura si focalizza su come soddisfare queste due funzioni dimostrative invece di creare un'applicazione completamente sviluppata a livello di produzione. La distribuzione di questa esercitazione e lasciarla esposta e in esecuzione significa che chiunque trova l'applicazione può eseguire le stesse azioni: caricare i file sul tuo bucket IBM Cloud Object Storage e visualizzare tutte le immagini JPG già presenti nei loro browser.

Sviluppo dell'applicazione

Nel file 'package.json, all'interno dell'oggetto scripts, si vede come viene definito "start". Questo file viene utilizzato da IBM Cloud Platform per far sapere a Node di eseguire app.js ogni volta che viene avviata l'applicazione. Utilizzatela anche per testare l'applicazione in locale. Guardate il file principale dell'applicazione, che si chiama 'app.js. Questo è il codice che si è detto a Node.js di elaborare per primo quando si avvia l'applicazione con il comando 'npm start (o 'nodemon).

{
    "scripts": {
      "start": "node app.js"
    }
}

Il file app.js utilizza il nodo per caricare i moduli necessari per iniziare. Il framework Express crea l'applicazione come un singleton semplice denominato app. L'esempio termina (tralasciando per ora la maggior parte del codice) dicendo all'applicazione di ascoltare sulla porta assegnata e su una proprietà dell'ambiente, o su 3000 per impostazione predefinita. Quando si avvia con successo all'inizio, stampa un messaggio con l'URL del server sulla console.

var express = require('express');
var cfenv = require('cfenv');
var bodyParser = require('body-parser');
var app = express();
//...

// start server on the specified port and binding host
var port = process.env.PORT || 3000;
app.listen(port, function() {
    console.log("To view your app, open this link in your browser: http://localhost:" + port);
});
//...

Vediamo come definire un percorso e le viste. La prima riga di codice indica al framework Express di utilizzare la cartella public per servire i file statici, che comprendono le immagini statiche e i fogli di stile utilizzati. Le righe successive indicano all'applicazione dove trovare i modelli delle viste nella cartella 'src/views e impostano il motore delle viste come EJS. Inoltre, il framework utilizza il middleware body-parser per esporre i dati delle richieste in arrivo all'applicazione come JSON. Nelle ultime righe dell'esempio, l'applicazione express risponde a tutte le richieste GET in arrivo all'URL dell'applicazione rendendo il modello di vista 'index.ejs.

//...
// serve the files out of ./public as your main files
app.use(express.static('public'));
app.set('views', './src/views');
app.set('view engine', 'ejs');
app.use(bodyParser.json());

var title = 'COS Image Gallery Web Application';
// Serve index.ejs
app.get('/', function (req, res) {
  res.render('index', {status: '', title: title});
});

//...

La seguente figura mostra di quale template di visualizzazione di indice viene eseguito il rendering e inviato al browser. Se si sta utilizzando nodemon, è possibile che il browser sia stato aggiornato quando sono state salvate le modifiche.

La vostra applicazione web aggiornata utilizzando modelli e viste per la visualizzazione
' '

I nostri modelli di vista condividono il codice HTML tra i tag <head>...</head>; in modo da posizionarlo in un modello di inclusione separato. Questo modello (head-inc.ejs) contiene uno scriptlet (un binding per una variabile JavaScript ) per il titolo della pagina alla riga 1. La variabile 'title viene impostata in 'app.js e passata come dato per il modello di vista nella riga sottostante. Altrimenti, si utilizzano semplicemente alcuni indirizzi di CDN per prelevare 'Bootstrap CSS, 'Bootstrap JavaScript e 'JQuery. Infine, aggiungere un file styles.css statico personalizzato dalla directory pubic/stylesheets.

<title><%=title%></title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"
      integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
      crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.1.1.min.js"
        integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
        crossorigin="anonymous">
</script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"
        integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"
        crossorigin="anonymous">
</script>

<link rel="stylesheet" href="stylesheets/style.css">

Il corpo della vista indice contiene le schede di navigazione in stile bootstrap e il modulo di caricamento in un layout di base fornito dagli stili CSS inclusi in bootstrap.

Considerate queste due specifiche per la vostra applicazione:

  • Impostare il metodo del modulo su " POST e il tipo di codifica dei dati del modulo come multipart/form-data alla riga 24. Per l'azione del modulo, inviare i dati dal modulo all'applicazione sulla rotta "/". In seguito, fare un lavoro supplementare nella logica del router per gestire le richieste 'POST a quella rotta.

  • Visualizza un feedback sullo stato del tentativo di caricamento di un file per l'utente. Questo feedback viene passato alla vista in una variabile chiamata "status" e viene visualizzato dopo il modulo di caricamento.

<!DOCTYPE html>
<html>

<head>
    <%- include('head-inc'); %>
</head>

<body>
<ul class="nav nav-tabs">
    <li role="presentation" class="active"><a href="/">Home</a></li>
    <li role="presentation"><a href="/gallery">Gallery</a></li>
</ul>
<div class="container">
    <h2>Upload Image to IBM Cloud Object Storage</h2>
    <div class="row">
        <div class="col-md-12">
            <div class="container" style="margin-top: 20px;">
                <div class="row">

                    <div class="col-lg-8 col-md-8 well">

                        <p class="wellText">Upload your JPG image file here</p>

                        <form method="post" enctype="multipart/form-data" action="/">
                            <p><input class="wellText" type="file" size="100px" name="img-file" /></p>
                            <br/>
                            <p><input class="btn btn-danger" type="submit" value="Upload" /></p>
                        </form>

                        <br/>
                        <span class="notice"><%=status%></span>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
</body>

</html>

Prendiamo un momento per tornare a app.js. L'esempio imposta le rotte Express per gestire le richieste extra che vengono fatte all'applicazione. Il codice per questi metodi di instradamento si trova in due file nella cartella './src/routes del progetto:

  • imageUploadRoutes.js: Questo file gestisce ciò che accade quando l'utente seleziona un'immagine e fa clic su Carica.

  • galleryRoutes.js: questo file gestisce le richieste quando l'utente fa clic sulla scheda sulla scheda Galleria per richiedere la vista 'imageGallery.

//...
var imageUploadRoutes = require('./src/routes/imageUploadRoutes')(title);
var galleryRouter = require('./src/routes/galleryRoutes')(title);

app.use('/gallery', galleryRouter);
app.use('/', imageUploadRoutes);

//...

Caricamento di immagini

Consultare il codice di imageUploadRoutes.js. È necessario creare un'istanza di un nuovo router express e nominarlo 'imageUploadRoutes all'inizio. Successivamente, creare una funzione che restituisca 'imageUploadRoutes e assegnarla a una variabile chiamata 'router. Una volta completata, la funzione deve essere esportata come modulo per renderla accessibile al framework e al codice principale in 'app.js. Per separare la logica di instradamento dalla logica di caricamento è necessario un file controller chiamato 'galleryController.js. Poiché questa logica è dedicata all'elaborazione della richiesta in arrivo e alla fornitura della risposta appropriata, inserirla in questa funzione e salvarla nella cartella './src/controllers.

L'istanza del router del framework Express è il luogo in cui il " imageUploadRoutes è progettato per instradare le richieste per il percorso principale dell'applicazione ("/") quando viene utilizzato il metodo HTTP " POST. All'interno del metodo 'post del vostro 'imageUploadRoutes, utilizzate il middleware dei moduli 'multer e 'multer-s3 che è esposto dal 'galleryController come 'upload. Il middleware prende i dati e il file dal modulo di caricamento 'POST, li elabora ed esegue una funzione di callback. Nella funzione di callback, verificare che sia stato ottenuto un codice di stato HTTP di '200 e che sia stato caricato almeno un file nell'oggetto della richiesta. In base a queste condizioni, impostare il feedback nella variabile 'status e rendere il modello della vista indice con il nuovo stato.

var express = require('express');
var imageUploadRoutes = express.Router();
var status = '';

var router = function(title) {

    var galleryController =
        require('../controllers/galleryController')(title);

    imageUploadRoutes.route('/')
    	.post(
    		galleryController.upload.array('img-file', 1), function (req, res, next) {
                if (res.statusCode === 200 && req.files.length > 0) {
                    status = 'uploaded file successfully';
                }
                else {
                    status = 'upload failed';
                }
                res.render('index', {status: status, title: title});
            });

    return imageUploadRoutes;
};

module.exports = router;

In confronto, il codice del " galleryRouter è un modello di semplicità. Seguire lo stesso schema di 'imageUploadRouter e richiedere 'galleryController sulla prima riga della funzione, quindi impostare il percorso. La differenza principale è che si instrada la richiesta HTTP 'GET anziché 'POST e si invia tutto l'output nella risposta da 'getGalleryImages, che è esposto da 'galleryController nell'ultima riga dell'esempio.

var express = require('express');
var galleryRouter = express.Router();

var router = function(title) {

    var galleryController =
        require('../controllers/galleryController')(title);

    galleryRouter.route('/')
        .get(galleryController.getGalleryImages);

    return galleryRouter;
};
module.exports = router;

Successivamente, guarda il controller per la galleria.

Nota come hai configurato il caricamento multer, che tronca del codice che ignori per ora. Sono necessari i moduli 'ibm-cos-sdk, 'multer e 'multer-s3. Il codice mostra come configurare un oggetto S3 che punta a un endpoint server Object Storage. Per semplicità, si impostano staticamente valori come l'indirizzo dell'endpoint, la regione e il bucket, ma potrebbero essere facilmente referenziati da una variabile d'ambiente o da un file di configurazione JSON.

Definire upload in imageUploadRouter creando una nuova istanza multer con storage come unica proprietà. Questa proprietà indica al 'multer dove inviare il file dal 'multipart/form-data. Poiché la piattaforma IBM Cloud utilizza un'implementazione dell'API S3 Utilizza un'implementazione dell'API S3, impostare l'archiviazione come un oggetto 's3-multer. Questo oggetto s3-multer contiene una proprietà s3 assegnata all'oggetto s3. Esiste anche una proprietà bucket assegnata alla variabile myBucket, a cui viene assegnato il valore web-images. L'oggetto 's3-multer ora ha tutti i dati necessari per caricare i file nel secchio Object Storage quando riceve i dati dal modulo di caricamento. Il nome (o la chiave) dell'oggetto caricato è il nome file originale.

Utilizzare una data / ora come parte del nome file per mantenere l'univocità del nome file.

var galleryController = function(title) {

    var aws = require('ibm-cos-sdk');
    var multer = require('multer');
    var multerS3 = require('multer-s3');

    var ep = new aws.Endpoint('s3.us-south.cloud-object-storage.appdomain.cloud');
    var s3 = new aws.S3({endpoint: ep, region: 'us-south-1'});
    var myBucket = 'web-images';

    var upload = multer({
        storage: multerS3({
            s3: s3,
            bucket: myBucket,
            acl: 'public-read',
            metadata: function (req, file, cb) {
                cb(null, {fieldName: file.fieldname});
            },
            key: function (req, file, cb) {
                console.log(file);
                cb(null, file.originalname);
            }
        })
    });

    var getGalleryImages = function (req, res) { /* ... shown below ... */ };

    return {
        getGalleryImages: getGalleryImages,
        upload: upload
    };
};

module.exports = galleryController;

Per un test locale, un'attività utile è di visualizzare a schermo l'oggetto file nella console, console.log(file). Eseguire un test locale del modulo di caricamento e mostrare l'output del log della console del file.

{ fieldname: 'img-file',
originalname: 'Chrysanthemum.jpg',
encoding: '7bit',
mimetype: 'image/jpeg' }

Il feedback del callback dichiara che l'applicazione ha "caricato correttamente il file" quando è stato eseguito il test.

Successo!
localtest1

Visualizzazione e richiamo dell'immagine

Ricordiamo che in 'app.js, la riga di codice 'app.use('/gallery', galleryRouter); indica al framework express di usare quel router quando viene richiesto il percorso '/gallery. Tale router utilizza galleryController.js, definisce la funzione getGalleryImages, la firma della quale è stata precedentemente visualizzata. Utilizzando lo stesso oggetto 's3 impostato per la funzione di caricamento delle immagini, richiamare la funzione denominata 'listObjectsV2. Questa funzione restituisce i dati dell'indice che definiscono ciascuno degli oggetti del bucket. Per visualizzare le immagini all'interno dell'HTML, è necessario un URL immagine per ogni immagine JPEG nel secchio 'web-images da visualizzare nel modello di vista. La chiusura con l'oggetto dati restituito da 'listObjectsV2 contiene metadati su ogni oggetto del bucket.

Il codice esegue il loop di 'bucketContents alla ricerca di qualsiasi chiave di oggetto che finisca con ".jpg" e crea un parametro da passare alla funzione S3 'getSignedUrl. Questa funzione restituisce un URL firmato per qualsiasi oggetto quando si forniscono il nome del bucket e la chiave dell'oggetto. Nella funzione di callback, salvare ogni URL in un array e passarlo al metodo di risposta del HTTP Server 'res.render come valore di una proprietà chiamata 'imageUrls.

//...

    var getGalleryImages = function (req, res) {
        var params = {Bucket: myBucket};
        var imageUrlList = [];

        s3.listObjectsV2(params, function (err, data) {
            if (data) {
                var bucketContents = data.Contents;
                for (var i = 0; i < bucketContents.length; i++) {
                    if (bucketContents[i].Key.search(/.jpg/i) > -1) {
                        var urlParams = {Bucket: myBucket, Key: bucketContents[i].Key};
                        s3.getSignedUrl('getObject', urlParams, function (err, url) {
                            imageUrlList.push(url);
                        });
                    }
                }
            }
            res.render('galleryView', {
                title: title,
                imageUrls: imageUrlList
            });
        });
    };

//...

L'ultimo esempio di codice mostra il corpo del modello galleryView con il codice necessario per visualizzare le tue immagini. Ottenere l'array imageUrls dal metodo res.render() e iterare su una coppia di tag <div>...</div> nidificati. Ciascuno invia una richiesta GET per l'immagine quando viene richiesto l'instradamento /gallery.

<!DOCTYPE html>
<html>

<head>
    <%- include('head-inc'); %>
</head>

<body>
    <ul class="nav nav-tabs">
        <li role="presentation"><a href="/">Home</a></li>
        <li role="presentation" class="active"><a href="/gallery">Gallery</a></li>
    </ul>
    <div class="container">
        <h2>IBM COS Image Gallery</h2>

        <div class="row">
            <% for (var i=0; i < imageUrls.length; i++) { %>
                <div class="col-md-4">
                    <div class="thumbnail">
                            <img src="<%=imageUrls[i]%>" alt="Lights" style="width:100%">
                    </div>
                </div>
            <% } %>
        </div>
    </div>
</body>

</html>

Verifica l'applicazione localmente da http://localhost:3000/gallery e visualizza la tua immagine.

Le immagini caricate nel bucket sono in mostra
localtest2

Commit a Git

Ora che le funzioni di base dell'applicazione funzionano, eseguite il commit del codice nel vostro repo locale e poi inviatelo a GitHub. Utilizzando GitHub Desktop, fare clic su Modifiche (vedere Figura 11), digitare un riepilogo delle modifiche nel campo Riepilogo e quindi fare clic su Impegna in Local-dev.

Modifiche pronte per l'impegno in Git
Aggiornamenti dell'impegno

Quando fai clic su sync, il tuo commit viene inviato al ramo local-dev remoto. Questa azione avvia le fasi di creazione e distribuzione in Delivery Pipeline.

Delivery Pipeline CD
' '

Passi successivi

Sei andato dall'inizio alla fine e hai creato una galleria di immagini dell'applicazione Web di base utilizzando la Piattaforma IBM Cloud. Ciascuno dei concetti che hai trattato in questa introduzione di base può essere ulteriormente esplorato all'indirizzo IBM Cloud Object Storage.

Buona fortuna!