Node.js voor beginners

Event-driven programmeren kan overweldigend zijn voor beginners, waardoor Node.js moeilijk is om mee te beginnen. Maar laat dat je niet ontmoedigen; In dit artikel zal ik je enkele basisprincipes van Node.js leren en uitleggen waarom het zo populair is geworden.

Als u hulp nodig heeft, kunt u altijd contact opnemen met een van de JavaScript-experts op Envato Studio. Of je nu een bug hebt gerepareerd of een nieuwe functie hebt toegevoegd, je zult een ervaren JavaScript-ontwikkelaar vinden om je te helpen.

Leer JavaScript: de complete gids

We hebben een complete handleiding samengesteld om u te helpen JavaScript te leren, of u net bent begonnen als een webontwikkelaar of dat u meer geavanceerde onderwerpen wilt verkennen.

Invoering

Als u Node.js wilt gaan gebruiken, moet u eerst de verschillen tussen Node.js en traditionele server-side scripting-omgevingen begrijpen (bijvoorbeeld: PHP, Python, Ruby, enzovoort).

Asynchrone programmering

Node.js gebruikt een module-architectuur om het maken van complexe applicaties te vereenvoudigen.

De kans is groot dat je bekend bent met asynchrone programmering; het is tenslotte de "A" in Ajax. Elke functie in Node.js is asynchroon. Daarom wordt alles dat normaal gesproken de thread blokkeert, in plaats daarvan op de achtergrond uitgevoerd. Dit is het belangrijkste om te onthouden over Node.js. Als u bijvoorbeeld een bestand op het bestandssysteem leest, moet u een callback-functie opgeven die wordt uitgevoerd wanneer de leesbewerking is voltooid.

Je doet alles!

Node.js is slechts een omgeving - wat betekent dat je alles zelf moet doen. Er is geen standaard HTTP-server of welke server dan ook. Dit kan overweldigend zijn voor nieuwe gebruikers, maar de uitbetaling is een goed presterende web-app. Eén script verwerkt alle communicatie met de clients. Dit vermindert aanzienlijk het aantal bronnen dat door de toepassing wordt gebruikt. Hier is bijvoorbeeld de code voor een eenvoudige Node.js-toepassing:

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

En hier is het equivalent geschreven in PHP:

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

Laten we nu naar de benchmarknummers kijken. De volgende tabel bevat de reactietijden in milliseconden voor deze twee eenvoudige toepassingen:

Aantal iteraties Node.js PHP
100 2.00 0.14
10'000 3.00 10.53
1'000'000 15.00 1119,24
10'000'000 143.00 10621,46
1'000'000'000 11118,00 1.036.272,19

Ik voerde de twee apps uit vanaf de opdrachtregel, zodat geen enkele server de uitvoering van de apps zou vertragen. Ik heb elke test tien keer uitgevoerd en de resultaten gemiddeld. PHP is opmerkelijk sneller met een kleinere hoeveelheid iteraties, maar dat voordeel lost snel op naarmate het aantal iteraties toeneemt. Wanneer alles is gezegd en gedaan, is PHP 93% langzamer dan Node.js!

Node.js is snel, maar je moet een paar dingen leren om het goed te kunnen gebruiken.

modules

Node.js gebruikt een module-architectuur om het maken van complexe applicaties te vereenvoudigen. Modules zijn vergelijkbaar met bibliotheken in C, of ​​eenheden in Pascal. Elke module bevat een aantal functies met betrekking tot het "onderwerp" van de module. Bijvoorbeeld de http module bevat functies die specifiek zijn voor HTTP. Node.js biedt standaard enkele kernmodules om u te helpen bij het openen van bestanden op het bestandssysteem, het maken van HTTP- en TCP / UDP-servers en andere handige functies uit te voeren.

Een module toevoegen is eenvoudig; bel gewoon de vereisen() functie, zoals deze:

var http = require ('http');

Node.js is slechts een omgeving; je moet alles zelf doen.

De vereisen() functie retourneert de verwijzing naar de opgegeven module. In het geval van deze code, een verwijzing naar de http module wordt opgeslagen in de http veranderlijk.

In de bovenstaande code hebben we de naam van een module doorgegeven aan de vereisen() functie. Dit zorgt ervoor dat het knooppunt naar een zoekt node_modules map in de map van onze toepassing en zoek naar de http module in die map. Als Knoop het niet vindt node_modules map (of de http module erin), dan kijkt het door de globale module-cache. U kunt ook een actueel bestand opgeven door een relatief of absoluut pad door te geven, zoals:

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

Modules zijn ingekapselde stukjes code. De code binnen een module is meestal privé - wat betekent dat de functies en variabelen die daarin zijn gedefinieerd alleen toegankelijk zijn vanaf de binnenkant van de module. U kunt echter functies en / of variabelen blootleggen voor gebruik buiten de module. Gebruik hiervoor de export object en vul de eigenschappen en methoden met de stukjes code die u wilt blootstellen. Beschouw de volgende module als een voorbeeld:

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

Deze code maakt een PI variabele die alleen toegankelijk is via de code in de module; het is niet toegankelijk buiten de module. Vervolgens worden twee functies gemaakt op de export voorwerp. Deze functies zijn toegankelijk buiten de module omdat ze zijn gedefinieerd op de export voorwerp. Als gevolg, PI is volledig beschermd tegen interferentie van buitenaf. Daarom kunt u er gerust op zijn Gebied() en omtrek() zal zich altijd gedragen zoals zou moeten (zolang een waarde wordt geleverd voor de r parameter).

Global Scope

Node is een JavaScript-omgeving die wordt uitgevoerd in de V8 JavaScript-engine van Google. Als zodanig moeten we de best practices volgen die we gebruiken voor ontwikkeling aan de klantzijde. We moeten bijvoorbeeld voorkomen dat we iets in de mondiale dimensie plaatsen. Dat is echter niet altijd mogelijk. Het globale bereik in Node is GLOBAAL (in tegenstelling tot venster in de browser) en u kunt gemakkelijk een globale variabele van de functie maken door de var trefwoord, zoals dit:

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

Nogmaals, globals moeten zoveel mogelijk worden vermeden. Dus wees voorzichtig en onthoud om te gebruiken var bij het declareren van een variabele.

Installatie

Natuurlijk moeten we Node installeren voordat we een app kunnen schrijven en uitvoeren. De installatie is eenvoudig, als u Windows of OS X gebruikt; de nodejs.org-website biedt installatieprogramma's voor die besturingssystemen. Gebruik voor Linux elke pakketbeheerder. Open uw terminal en typ:

sudo apt-get update sudo apt-get install knooppunt

of:

sudo aptitude update sudo aptitude install node

Node.js bevindt zich in sidebibliotheken; mogelijk moet je ze toevoegen aan je lijst met bronnen:

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

Houd er echter rekening mee dat het installeren van sid-pakketten op oudere systemen uw systeem kan beschadigen. Wees voorzichtig en verwijder /etc/apt/sources.list.d/sid.list nadat je klaar bent met het installeren van Node.

Nieuwe modules installeren

Node.js heeft een pakketbeheerder, genaamd Node Package Manager (NPM). Het wordt automatisch geïnstalleerd met Node.js en u gebruikt NPM om nieuwe modules te installeren. Om een ​​module te installeren, opent u uw terminal / opdrachtregel, navigeert u naar de gewenste map en voert u de volgende opdracht uit:

npm install module_naam

Het maakt niet uit welk besturingssysteem je hebt; Met de opdracht hierboven wordt de module geïnstalleerd die u opgeeft in plaats van module naam.

De Hello World-app

Uiteraard zal ons eerste Node.js-script de tekst afdrukken 'Hallo Wereld!' naar de console. Maak een bestand, genaamd hello.js, en typ de volgende code:

console.log ('Hallo wereld!');

Laten we nu het script uitvoeren. Open de terminal / opdrachtregel, navigeer naar de map die deze bevat hello.js, en voer de volgende opdracht uit:

knoop hello.js

Je zou moeten zien 'Hallo Wereld!' weergegeven in de console.

HTTP-server

Laten we verder gaan met een meer geavanceerde applicatie; het is niet zo ingewikkeld als je misschien denkt. Laten we beginnen met de volgende code. Lees de reacties en vervolgens de uitleg hieronder:

// http-module opnemen. var http = require ("http"); // Maak de server. De functie die als parameter is doorgegeven, wordt bij elk ingediend verzoek opgeroepen. // verzoekvariabele bevat alle verzoekparameters // antwoordvariabele stelt u in staat om alles te doen met een antwoord verzonden naar de client. http.createServer (functie (verzoek, antwoord) // luisteraar bij eindgebeurtenis. // Deze gebeurtenis wordt aangeroepen wanneer de client alle gegevens verzendt en wacht op reactie. request.on ("end", function () // Schrijf headers naar het antwoord. // 200 is HTTP-statuscode (dit betekent succes) // Tweede parameter bevat headervelden in object // We sturen platte tekst, dus Content-Type moet tekst / duidelijke respons zijn.writeHead (200 , 'Inhoudstype': 'text / plain'); // Gegevens verzenden en antwoord beëindigen response.end ('Hello HTTP!');); // Luister naar de poort 8080.) luister (8080);

Deze code is heel eenvoudig. U kunt meer gegevens naar de client verzenden met behulp van de response.write () methode, maar u moet het bellen voordat u belt Response.End (). Sla deze code op als http.js en typ dit in je console:

knooppunt http.js

Open uw browser en navigeer naar http: // localhost: 8080. Je zou de tekst "Hallo HTTP!" op de pagina.

Omgaan met URL-parameters

Zoals ik eerder al zei, moeten we alles zelf in het knooppunt doen, inclusief argumenten voor het parseren van aanvragen. Dit is echter vrij eenvoudig. Bekijk de volgende code:

// http-module opnemen, var http = require ("http"), // En URL-module, wat erg handig is bij het ontleden van verzoekparameters. url = vereisen ("url"); // Maak de server. http.createServer (functie (verzoek, antwoord) // Deelnemer koppelen aan einde gebeurtenis. request.on ('einde', functie () // Parseer het verzoek om argumenten en sla ze op in _get variabele. // Deze functie parseert de URL van het verzoek en retourneert objectrepresentatie var_get = url.parse (request.url, true) .query; // Schrijf headers naar het antwoord.rea.writeHead (200, 'Content-type': 'text / plain '); // Gegevens verzenden en antwoord beëindigen response.end (' Hier zijn uw gegevens: '+ _get [' data ']);); // Luister naar de poort 8080.) listen (8080) ;

Deze code gebruikt de ontleden () methode van de url module, een kern module Node.js, om de URL van het verzoek naar een object te converteren. Het geretourneerde object heeft een vraag eigenschap, die de parameters van de URL ophaalt. Sla dit bestand op als get.js en voer het uit met de volgende opdracht:

knooppunt get.js

Navigeer vervolgens naar http: // localhost: 8080 / data = put_some_text_here in uw browser. Natuurlijk, het veranderen van de waarde van de gegevens parameter verbreekt het script niet.

Bestanden lezen en schrijven

Om de bestanden in Node te beheren, gebruiken we de fs module (een kernmodule). We lezen en schrijven bestanden met behulp van de fs.readFile () en fs.writeFile () methoden. Ik zal de argumenten na de volgende code uitleggen:

// http-module opnemen, var http = require ("http"), // En mysql-module die u zojuist hebt geïnstalleerd. fs = vereisen ("fs"); // Maak de http-server. http.createServer (functie (verzoek, antwoord) // Deelnemer koppelen aan einde gebeurtenis. request.on ("einde", functie () // Lees het bestand. fs.readFile ("test.txt", 'utf- 8 ', functie (fout, gegevens) // Schrijf headers.response.writeHead (200, ' Content-type ':' text / plain '); // Verhoog het nummer verkregen uit het bestand. Data = parseInt (data ) + 1; // Schrijf verhoogd nummer naar bestand fs.writeFile ('test.txt', data); // Eindantwoord met een leuk bericht response.end ('Deze pagina is' + data + 'keer vernieuwd! '););); // Luister naar de 8080-poort.) Listen (8080);

Node.js heeft een pakketbeheerder, genaamd Node Package Manager (NPM). Het wordt automatisch geïnstalleerd met Node.js

Bewaar deze als files.js. Voordat u dit script uitvoert, maakt u een bestand met de naam test.txt in dezelfde map als files.js.

Deze code demonstreert de fs.readFile () en fs.writeFile () methoden. Telkens wanneer de server een verzoek ontvangt, leest het script een nummer uit het bestand, verhoogt het het aantal en schrijft het nieuwe nummer naar het bestand. De fs.readFile () methode accepteert drie argumenten: de naam van het bestand dat moet worden gelezen, de verwachte codering en de callback-functie.

Het schrijven naar het bestand is, althans in dit geval, veel eenvoudiger. We hoeven niet te wachten op resultaten, hoewel u zou controleren op fouten in een echte applicatie. De fs.writeFile () methode accepteert de bestandsnaam en gegevens als argumenten. Het accepteert ook derde en vierde argumenten (beide zijn optioneel) om respectievelijk de codering en de callback-functie te specificeren.

Laten we dit script nu uitvoeren met de volgende opdracht:

node files.js

Open het in browser (http: // localhost: 8080) en ververs het een paar keer. U denkt misschien dat er een fout in de code zit omdat deze met twee wordt verhoogd. Dit is geen fout. Telkens wanneer u deze URL opvraagt, worden twee aanvragen naar de server verzonden. Het eerste verzoek wordt automatisch gedaan door de browser, die daarom verzoekt favicon.ico, en natuurlijk is het tweede verzoek voor de URL (http: // localhost: 8080).

Hoewel dit gedrag technisch gezien geen fout is, is het gedrag dat we niet willen. We kunnen dit eenvoudig oplossen door de aanvraag-URL te controleren. Hier is de herziene code:

// http-module opnemen, var http = require ("http"), // En mysql-module die u zojuist hebt geïnstalleerd. fs = vereisen ("fs"); // Maak de http-server. http.createServer (functie (verzoek, antwoord) // Deelnemer koppelen aan eindgebeurtenis request.on ('einde', functie () // Controleer of gebruiker vraagt ​​/ indien (request.url == '/')  // Lees het bestand fs.readFile ('test.txt', 'utf-8', functie (fout, gegevens) // Schrijf headers.response.writeHead (200, 'Content-Type': 'text / gewoon '); // Verhoog het aantal verkregen uit bestand. data = parseInt (data) + 1; // Schrijf opgehoogd nummer naar bestand fs.writeFile (' test.txt ', data); // Beëindig antwoord met wat leuk bericht response.end ('Deze pagina is vernieuwd' + data + 'keer!');); else // Aangeven dat aangevraagd bestand niet is gevonden. response.writeHead (404); // En eindverzoek zonder het verzenden van gegevens. response.end ();); // Luister op de 8080-poort.) listen (8080);

Test het nu; het zou moeten werken zoals verwacht.

Toegang tot MySQL-databases

De meeste traditionele server-side technologieën hebben een ingebouwde manier om verbinding te maken met en een database te raadplegen. Met Node.js moet je een bibliotheek installeren. Voor deze tutorial heb ik de stal gekozen en gemakkelijk te gebruiken knooppunt-mysql. De volledige naam van deze module is [email protected] (alles nadat @ het versienummer is). Open uw console, ga naar de map waarin u uw scripts heeft opgeslagen en voer de volgende opdracht uit:

npm install [email protected]

Dit download en installeert de module, en het maakt ook de node_modules map in de huidige map. Laten we nu kijken hoe we dit in onze code kunnen gebruiken; zie het volgende voorbeeld:

// http-module opnemen, var http = require ('http'), // En mysql-module die u zojuist hebt geïnstalleerd. mysql = require ("mysql"); // Maak de verbinding. // Gegevens zijn standaard ingesteld op de nieuwe mysql-installatie en moeten worden gewijzigd volgens uw configuratie. var connection = mysql.createConnection (user: "root", password: "", database: "db_name"); // Maak de http-server. http.createServer (functie (verzoek, antwoord) // Deelnemer koppelen aan einde gebeurtenis. request.on ('einde', functie () // Vraag de database. connection.query ('SELECT * FROM your_table;', function (fout, rijen, velden) response.writeHead (200, 'Content-type': 'x-application / json'); // Gegevens verzenden als JSON-tekenreeks // Rijen-variabele bevat het resultaat van de query. response.end (JSON.stringify (rijen)););); // Luister naar de poort 8080.) listen (8080);

Het opvragen van de database met deze bibliotheek is eenvoudig; voer eenvoudig de querystring en callback-functie in. In een echte applicatie moet je controleren of er fouten zijn (de fout parameter zal dat niet zijn onbepaald als er fouten zijn opgetreden) en stuur reactiecodes afhankelijk van het succes of de mislukking van de query. Merk ook op dat we de Content-Type naar x-application / json, wat het geldige MIME-type is voor JSON. De rijen parameter bevat het resultaat van de query en we converteren de gegevens eenvoudigweg in rijen naar een JSON-structuur met behulp van de JSON.stringify () methode.

Sla dit bestand op als mysql.js, en voer het uit (als je MySQL hebt geïnstalleerd, dat is):

knoop mysql.js

Navigeren naar http: // localhost: 8080 in uw browser en u moet worden gevraagd om het JSON-geformatteerde bestand te downloaden.

Conclusie

Elke functie in Node.js is asynchroon.

Node.js vereist extra werk, maar de beloning van een snelle en krachtige applicatie is het waard. Als u niet alles op het laagste niveau wilt doen, kunt u altijd een kader kiezen, zoals> Express, om het eenvoudiger te maken om applicaties te ontwikkelen.

Node.js is een veelbelovende technologie en een uitstekende keuze voor toepassingen met hoge belasting. Het is bewezen door bedrijven, zoals Microsoft, eBay en Yahoo. Als u niet zeker bent van het hosten van uw website / applicatie, kunt u altijd een goedkope VPS-oplossing of verschillende cloud-gebaseerde services gebruiken, zoals Microsoft Azure en Amazon EC2. Beide services bieden schaalbare omgevingen tegen een redelijke prijs.

Vergeet niet om commentaar te geven als u vragen hebt!