Node.js per principianti

La programmazione guidata dagli eventi può essere travolgente per i principianti, il che può rendere difficile iniziare con Node.js. Ma non lasciarti scoraggiare; In questo articolo, ti insegnerò alcune nozioni di base su Node.js e spiegherò perché è diventato così popolare.

Se hai bisogno di aiuto, puoi sempre contattare uno degli esperti JavaScript su Envato Studio. Se hai bisogno di un bug corretto o di una nuova funzione aggiunta, troverai uno sviluppatore JavaScript esperto che ti aiuterà.

Scopri JavaScript: la guida completa

Abbiamo creato una guida completa per aiutarti a imparare JavaScript, sia che tu stia appena iniziando come sviluppatore web o che desideri esplorare argomenti più avanzati.

introduzione

Per iniziare a utilizzare Node.js, devi prima capire le differenze tra Node.js e gli ambienti di scripting lato server tradizionali (es .: PHP, Python, Ruby, ecc.).

Programmazione asincrona

Node.js utilizza un'architettura di modulo per semplificare la creazione di applicazioni complesse.

È probabile che tu abbia dimestichezza con la programmazione asincrona; dopotutto è la "A" di Ajax. Ogni funzione in Node.js è asincrona. Pertanto, tutto ciò che normalmente bloccherebbe il thread viene invece eseguito in background. Questa è la cosa più importante da ricordare su Node.js. Ad esempio, se stai leggendo un file sul file system, devi specificare una funzione di callback che viene eseguita quando l'operazione di lettura è stata completata.

Stai facendo tutto!

Node.js è solo un ambiente, il che significa che devi fare tutto da solo. Non c'è un server HTTP predefinito o qualsiasi altro server. Questo può essere travolgente per i nuovi utenti, ma il payoff è un'app web ad alte prestazioni. Uno script gestisce tutte le comunicazioni con i client. Ciò riduce notevolmente il numero di risorse utilizzate dall'applicazione. Ad esempio, ecco il codice per una semplice applicazione Node.js:

var i, a, b, c, max; max = 1000000000; var d = Date.now (); per (i = 0; i < max; i++)  a = 1234 + 5678 + i; b = 1234 * 5678 + i; c = 1234 / 2 + i;  console.log(Date.now() - d);

Ed ecco l'equivalente scritto in PHP:

$ a = null; $ b = null; $ c = null; $ i = null; $ max = 1000000000; $ start = microtime (true); per ($ i = 0; $ i < $max; $i++)  $a = 1234 + 5678 + $i; $b = 1234 * 5678 + $i; $c = 1234 / 2 + $i;  var_dump(microtime(true) - $start);

Ora diamo un'occhiata ai numeri di riferimento. La seguente tabella elenca i tempi di risposta, in millisecondi, per queste due semplici applicazioni:

Numero di iterazioni Node.js PHP
100 2.00 0.14
10'000 3.00 10.53
1'000'000 15.00 1.119,24
10'000'000 143.00 10.621,46
1'000'000'000 11.118,00 1.036.272,19

Ho eseguito le due app dalla riga di comando in modo che nessun server ritardasse l'esecuzione delle app. Ho eseguito ogni test dieci volte e ho calcolato la media dei risultati. PHP è notevolmente più veloce con una minore quantità di iterazioni, ma questo vantaggio si dissolve rapidamente all'aumentare del numero di iterazioni. Quando tutto è stato detto e fatto, PHP è il 93% più lento di Node.js!

Node.js è veloce, ma dovrai imparare alcune cose per usarlo correttamente.

moduli

Node.js utilizza un'architettura di modulo per semplificare la creazione di applicazioni complesse. I moduli sono simili alle librerie in C o alle unità in Pascal. Ogni modulo contiene un insieme di funzioni relative al "soggetto" del modulo. Ad esempio, il http il modulo contiene funzioni specifiche per HTTP. Node.js fornisce alcuni moduli principali pronti all'uso per consentire l'accesso ai file sul file system, creare server HTTP e TCP / UDP ed eseguire altre utili funzioni.

Includere un modulo è facile; chiama semplicemente il richiedere() funzione, come questa:

var http = require ('http');

Node.js è solo un ambiente; devi fare tutto da solo.

Il richiedere() la funzione restituisce il riferimento al modulo specificato. Nel caso di questo codice, un riferimento al http il modulo è memorizzato nel http variabile.

Nel codice precedente, abbiamo passato il nome di un modulo al richiedere() funzione. Ciò fa in modo che Node cerchi a node_modules cartella nella directory dell'applicazione e cercare il file http modulo in quella cartella. Se Nodo non trova il node_modules cartella (o il http modulo al suo interno), quindi esamina la cache del modulo globale. Puoi anche specificare un file reale passando un percorso relativo o assoluto, in questo modo:

var myModule = require ('./ myModule.js');

I moduli sono pezzi di codice incapsulati. Il codice all'interno di un modulo è per lo più privato - il che significa che le funzioni e le variabili definite al loro interno sono accessibili solo dall'interno del modulo. Tuttavia, è possibile esporre funzioni e / o variabili da utilizzare al di fuori del modulo. Per fare ciò, utilizzare il esportazioni object e popolare le sue proprietà e metodi con i pezzi di codice che vuoi esporre. Considera il seguente modulo come esempio:

var PI = Math.PI; exports.area = function (r) return PI * r * r; ; exports.circumference = function (r) return 2 * PI * r; ;

Questo codice crea a PI variabile a cui può accedere solo il codice contenuto nel modulo; non è accessibile al di fuori del modulo. Successivamente, vengono create due funzioni sul esportazioni oggetto. Queste funzioni sono accessibili al di fuori del modulo perché sono definite sul esportazioni oggetto. Di conseguenza, PI è completamente protetto da interferenze esterne. Pertanto, puoi star certo che la zona() e circonferenza() si comporteranno sempre come dovrebbero (a condizione che venga fornito un valore per il r parametro).

Ambito globale

Il nodo è un ambiente JavaScript in esecuzione nel motore JavaScript V8 di Google. Pertanto, dovremmo seguire le migliori pratiche che usiamo per lo sviluppo lato client. Ad esempio, dovremmo evitare di inserire qualcosa nella portata globale. Ciò, tuttavia, non è sempre possibile. Lo scopo globale nel nodo è GLOBALE (al contrario di finestra nel browser) e puoi facilmente creare una variabile globale di funzione omettendo il var parola chiave, come questo:

globalVariable = 1; globalFunction = function () ...;

Ancora una volta, i globali dovrebbero essere evitati quando possibile. Quindi fai attenzione e ricorda di usare var quando si dichiara una variabile.

Installazione

Naturalmente, dobbiamo installare il nodo prima di poter scrivere ed eseguire un'app. L'installazione è semplice, se usi Windows o OS X; il sito web nodejs.org offre programmi di installazione per quei sistemi operativi. Per Linux, usa qualsiasi gestore di pacchetti. Apri il tuo terminale e digita:

sudo apt-get update sudo apt-get install node

o:

sudo aptitude update sudo aptitude install node

Node.js è in repository sid; potrebbe essere necessario aggiungerli al tuo elenco di fonti:

sudo echo deb http://ftp.us.debian.org/debian/ sid main> /etc/apt/sources.list.d/sid.list

Ma sappi che l'installazione di pacchetti sid su sistemi precedenti potrebbe danneggiare il tuo sistema. Stai attento e rimuovi /etc/apt/sources.list.d/sid.list dopo aver terminato l'installazione del nodo.

Installazione di nuovi moduli

Node.js ha un gestore di pacchetti, chiamato Node Package Manager (NPM). Viene automaticamente installato con Node.js e si utilizza NPM per installare nuovi moduli. Per installare un modulo, apri il terminale / riga di comando, passa alla cartella desiderata ed esegui il seguente comando:

npm install module_name

Non importa quale sistema operativo hai; il comando precedente installerà il modulo specificato al posto di nome_modulo.

L'app Hello World

Naturalmente, il nostro primo script Node.js stamperà il testo 'Ciao mondo!' alla console. Crea un file, chiamato hello.js, e digitare il seguente codice:

console.log ('Hello World!');

Ora eseguiamo lo script. Aprire il terminale / riga di comando, passare alla cartella che contiene hello.js, ed eseguire il seguente comando:

nodo hello.js

Tu dovresti vedere 'Ciao mondo!' visualizzato nella console.

Server HTTP

Passiamo ad un'applicazione più avanzata; non è così complicato come potresti pensare. Iniziamo con il seguente codice. Leggi i commenti e poi la spiegazione di seguito:

// Include il modulo http. var http = require ("http"); // Crea il server. La funzione passata come parametro viene richiamata su ogni richiesta effettuata. // La variabile richiesta contiene tutti i parametri della richiesta // La variabile di risposta consente di fare qualsiasi cosa con la risposta inviata al client. http.createServer (funzione (richiesta, risposta) // Allega listener sull'evento finale // Questo evento viene chiamato quando il client invia tutti i dati e attende la risposta. request.on ("end", function () // Scrivi le intestazioni alla risposta // 200 è il codice di stato HTTP (questo significa successo) // Il secondo parametro contiene i campi di intestazione nell'oggetto // Stiamo inviando testo semplice, quindi Content-Type dovrebbe essere text / plain response.writeHead (200 , 'Content-Type': 'text / plain'); // Invia dati e risposta finale. Response.end ('Hello HTTP!');); // Ascolta sulla porta 8080.). (8080);

Questo codice è molto semplice. È possibile inviare più dati al client utilizzando il Response.Write () metodo, ma devi chiamarlo prima di chiamare Response.End (). Salva questo codice come http.js e digita questo nella tua console:

nodo http.js

Apri il tuo browser e naviga verso http: // localhost: 8080. Dovresti vedere il testo "Ciao HTTP!" nella pagina.

Gestione dei parametri URL

Come ho detto prima, dobbiamo fare tutto da soli nel nodo, inclusi gli argomenti di richiesta di analisi. Questo è, tuttavia, abbastanza semplice. Dai un'occhiata al seguente codice:

// Include il modulo http, var http = require ("http"), // E il modulo url, che è molto utile nell'analisi dei parametri di richiesta. url = require ("url"); // Crea il server. http.createServer (funzione (richiesta, risposta) // Allega listener sull'evento finale request.on ('end', function () // Analizza la richiesta per gli argomenti e li memorizza nella variabile _get. // Questa funzione analizza l'url dalla richiesta e restituisce la rappresentazione dell'oggetto. var _get = url.parse (request.url, true) .query; // Scrivi intestazioni alla risposta. response.writeHead (200, 'Content-Type': 'text / plain '); // Invia dati e risposta finale. Response.end (' Ecco i tuoi dati: '+ _get [' data ']))); // Ascolta sulla porta 8080.). Ascolta (8080) ;

Questo codice usa il parse () metodo del url modulo, un modulo Node.js di base, per convertire l'URL della richiesta in un oggetto. L'oggetto restituito ha a domanda proprietà, che recupera i parametri dell'URL. Salva questo file come get.js ed eseguirlo con il seguente comando:

nodo get.js

Quindi, vai a http: // localhost: 8080 / Dati = put_some_text_here nel tuo browser. Naturalmente, cambiando il valore del dati parametro non romperà lo script.

Lettura e scrittura di file

Per gestire i file nel nodo, utilizziamo il fs modulo (un modulo principale). Leggiamo e scriviamo file usando il fs.readFile () e fs.writeFile () metodi, rispettivamente. Spiegherò gli argomenti dopo il seguente codice:

// Include il modulo http, var http = require ("http"), // E il modulo mysql che hai appena installato. fs = require ("fs"); // Crea il server http. http.createServer (function (request, response) // Collega il listener all'evento finale request.on ("end", function () // Leggi il file fs.readFile ("test.txt", 'utf- 8 ', function (error, data) // Scrive le intestazioni response.writeHead (200, ' Content-Type ':' text / plain '); // Incrementa il numero ottenuto dal file. Data = parseInt (dati ) + 1; // Scrivi il numero incrementato sul file. Fs.writeFile ('test.txt', data); // Termina la risposta con un bel messaggio. Response.end ('Questa pagina è stata aggiornata' + data + 'volte! '););); // Listen sulla porta 8080.). Listen (8080);

Node.js ha un gestore di pacchetti, chiamato Node Package Manager (NPM). Viene automaticamente installato con Node.js

Salva questo come files.js. Prima di eseguire questo script, creare un file denominato test.txt nella stessa directory di files.js.

Questo codice dimostra il fs.readFile () e fs.writeFile () metodi. Ogni volta che il server riceve una richiesta, lo script legge un numero dal file, incrementa il numero e scrive il nuovo numero nel file. Il fs.readFile () Il metodo accetta tre argomenti: il nome del file da leggere, la codifica prevista e la funzione di callback.

Scrivere sul file, almeno in questo caso, è molto più semplice. Non è necessario attendere alcun risultato, anche se verificherebbe la presenza di errori in un'applicazione reale. Il fs.writeFile () metodo accetta il nome del file e i dati come argomenti. Accetta anche il terzo e il quarto argomento (entrambi sono opzionali) per specificare rispettivamente la funzione di codifica e di callback.

Ora, eseguiamo questo script con il seguente comando:

nodo files.js

Aprilo nel browser (http: // localhost: 8080) e aggiornarlo alcune volte. Ora, potresti pensare che ci sia un errore nel codice perché sembra aumentare di due. Questo non è un errore. Ogni volta che richiedi questo URL, vengono inviate due richieste al server. La prima richiesta viene effettuata automaticamente dal browser, che richiede favicon.ico, e, naturalmente, la seconda richiesta è per l'URL (http: // localhost: 8080).

Anche se questo comportamento non è tecnicamente un errore, è un comportamento che non vogliamo. Possiamo sistemarlo facilmente controllando l'URL della richiesta. Ecco il codice revisionato:

// Include il modulo http, var http = require ("http"), // E il modulo mysql che hai appena installato. fs = require ("fs"); // Crea il server http. http.createServer (funzione (richiesta, risposta) // Allega listener sull'evento finale. request.on ('end', function () // Verifica se l'utente richiede / if (request.url == '/')  // Leggi il file fs.readFile ('test.txt', 'utf-8', function (error, data) // Scrivi intestazioni. Response.writeHead (200, 'Content-Type': 'text / plain '); // Incrementa il numero ottenuto dal file. dati = parseInt (dati) + 1; // Scrivi il numero incrementato nel file. fs.writeFile (' test.txt ', data); // Fine risposta con alcuni bel messaggio. response.end ('Questa pagina è stata aggiornata' + data + 'volte!');); else // Indica che il file richiesto non è stato trovato. response.writeHead (404); // E richiesta di fine senza inviare alcun dato. response.end ();); // Listen sulla porta 8080.). listen (8080);

Provalo ora; dovrebbe funzionare come previsto.

Accesso ai database MySQL

La maggior parte delle tecnologie tradizionali lato server ha un mezzo integrato per connettersi e interrogare un database. Con Node.js, devi installare una libreria. Per questo tutorial, ho scelto la versione stabile e facile da usare node-mysql. Il nome completo di questo modulo è [email protected] (tutto dopo che @ è il numero di versione). Apri la tua console, vai alla directory in cui hai memorizzato i tuoi script ed esegui il seguente comando:

npm installa [email protected]

Questo scarica e installa il modulo e crea anche il node_modules cartella nella directory corrente. Ora diamo un'occhiata a come possiamo usare questo nel nostro codice; vedere il seguente esempio:

// Include il modulo http, var http = require ('http'), // E il modulo mysql che hai appena installato. mysql = require ("mysql"); // Crea la connessione. // I dati sono predefiniti alla nuova installazione di mysql e dovrebbero essere modificati in base alla configurazione. var connection = mysql.createConnection (user: "root", password: "", database: "nome_db"); // Crea il server http. http.createServer (funzione (richiesta, risposta) // Allega listener sull'evento finale request.on ('end', function () // Interrogazione del database. connection.query ('SELECT * FROM your_table;', function (error, rows, fields) response.writeHead (200, 'Content-Type': 'x-application / json'); // Invia dati come stringa JSON. // La variabile di righe contiene il risultato della query. response.end (JSON.stringify (rows)););); // Listen sulla porta 8080.). listen (8080);

Interrogare il database con questa libreria è semplice; inserisci semplicemente la stringa di query e la funzione di callback. In una vera applicazione, dovresti controllare se ci sono stati errori (il errore parametro non sarà non definito se si sono verificati errori) e inviare i codici di risposta in base al successo o al fallimento della query. Si noti inoltre che abbiamo impostato il Tipo di contenuto a x-application / json, che è il tipo MIME valido per JSON. Il righe parametro contiene il risultato della query e convertiamo semplicemente i dati in righe a una struttura JSON utilizzando il JSON.stringify () metodo.

Salva questo file come mysql.js, ed eseguilo (se hai MySQL installato, cioè):

nodo mysql.js

Navigare verso http: // localhost: 8080 nel tuo browser e ti verrà chiesto di scaricare il file in formato JSON.

Conclusione

Ogni funzione in Node.js è asincrona.

Node.js richiede lavoro extra, ma il guadagno di un'applicazione veloce e robusta vale la pena. Se non vuoi fare tutto al livello più basso, puoi sempre scegliere qualche framework, come> Express, per facilitare lo sviluppo di applicazioni.

Node.js è una tecnologia promettente e una scelta eccellente per un'applicazione ad alto carico. È stato dimostrato da aziende come Microsoft, eBay e Yahoo. Se non sei sicuro di ospitare il tuo sito web / applicazione, puoi sempre utilizzare una soluzione VPS economica o vari servizi basati su cloud, come Microsoft Azure e Amazon EC2. Entrambi questi servizi offrono ambienti scalabili ad un prezzo ragionevole.

Non dimenticare di commentare se hai qualche domanda!