Headless Drupal & Node.js | Part 2/3: Node.js introductie

17 sep 2015

Joris Snoek - Project lead
Vragen? Let me know!
020 - 261 14 99

Dit is deel twee van de reeks “headless Drupal & NodeJS”, deel één vind je hier. In dit deel geef ik een ‘Hello Node’ introductie.

Over Node.js

Node.js maakt gebruik van complexe technieken en kan daarom verwarrend zijn om mee te werken. Het is daarom niet geschikt voor de beginnende web ontwikkelaar.

Een key-techniek hierin is dat Node.js Javascript op de server kan uitvoeren. Hij gebruikt hiervoor de V8 engine, maar dan op een server (Google Chrome gebruikt deze ook). Zo kan je dus Javascript uitvoeren op een server als vervanger voor bijvoorbeeld PHP. Node.js voegt daar een aantal unieke features aan toe:

Event driven
Net als client-side Javascript: Node.js wacht op een ‘event’ en reageert daarop. Het is een ‘asynchronous event driven framework’, geïnspireerd op technieken als Ruby's Event Machine of Python's Twisted. Wat heb je daar aan op een server? Node.js kan op deze manier vele events tegelijk behandelen: een request van een client, een database query of een file transfer.

Non-blocking
Node.js doet dit met ‘non-blocking’ technieken: hij wacht niet tot er gewenst respons komt en blockt dus niet. Dit is anders dan een traditionele server: die wacht op een request van een client en totdat die request geheel is afgehandeld blokkeert die traditionele server voor alle andere requests. Wanneer een request een zware database query genereert dan blokkeert de gehele server, ook voor alle andere clients.

Two way connections
Node.js wacht dus niet, hij blinkt uit in het verwerken van ‘two way connections’: Node.js wacht bijvoorbeeld niet op een respons van de database na een query. Maar komt weer in actie zodra de database gegevens terugstuurt.

Node.js's kracht

Hierdoor is node.js erg goed inzetbaar voor realtime applicaties. Vanwege zijn non-blocking architectuur kan node.js vele verbindingen tegelijk aan. Hij kan dus ingezet worden voor high performance server-client applicaties, bijvoorbeeld een zwaar bezochte website met vele ingelogde bezoekers. Maar is speciaal goed inzetbaar voor:

  • Data pushing naar een client.
  • Data uitwisseling tussen clients onderling, bijvoorbeeld: chats, multiplayer games & realtime datastreaming.

Namedropping

Node.js wordt gebruikt door onder andere Walmart en Paypal.

Uitdagingen Node.js

  • Je kunt niet gebruik maken van traditionele servers (bv Apache), een goede hoster zal dus moeilijker te vinden zijn.
  • Advanced Javascripts kennis is nodig.
  • De Node.js core is compact, je zult extra modules en maatwerk nodig hebben voor gewenste functies. Wat je hoe het beste kunt gebruiken zul je moeten inleren.
  • Node.js is in eerste instantie niet ontworpen voor het bouwen van websites, we hebben dus extra libraries nodig. In dit geval hebben we gekozen voor Express JS.
  • Relatief veel development installs nodig: Node.js zelf, Express JS, extra modules, Git.
  • Wanneer je weinig ervaring hebt op een nieuw platform, ken je de valkuilen niet. En elk platform, ook Node.js, heeft zijn valkuilen.

 

Intro in implementatie Node.js

 

1. Lokaal installeren van Node.js

Check allereerst of het al geïnstalleerd staat: enter 'node --version'in je terminal. Als je dan een versie te zien krijgt, dan staat het al geïnstalleerd:

Zo niet, ga naar https://nodejs.org, download en installeer het.

2. ‘Hello Node’

Normaal gezien zijn deze ‘hello world’ oefeningen nogal lame, maar voor Node.js geeft deze oefening meteen een goede introductie in de architectuur en toegepaste Javascripting.

2.1. Maak een folder aan, bijvoorbeeld op je desktop ‘testnode’:

2.2. Voeg een file toe in die folder, en noem die bijvoorbeeld ‘hellotest.js’.

2.3. Importeer modules

Zoals aangegeven, de Node.js core is minimalistisch van opzet. Dus om uberhaubt íets te doen, zal je allereerst modules moeten importeren. Dit kunnen core modules zijn, of externe modules (zie ook ‘npm’ verderop).

Allereerst hebben we de ‘http’ module nodig. Net als elke andere javascript library heb je hierin een aantal methods en properties die je na installatie kunt gebruiken. Je importeert deze als volgt: voeg volgende regel toe in bestand ‘hellotest.js’:

var http = require('http');

2.4 Create een server die response geeft

Vervolgens kan je de ‘createServer()’ method gebruiken om een server aan te maken. Deze plaats je ook in een variabele als volgt:

var http = require('http'); // import module
var myServer = http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type" : "text/html"});
    response.write(" Hello Test Node");
    response.end();
});

// create server myServer.listen(2000);

We kunnen in createServer() een custom function plaatsen die we zelf definiëren en uitwerken, maar we gebruiken hierin een ‘anonymous function’: een functie zonder naam. Deze techniek wordt ook wel een ‘callback’ genoemd. Wanneer die functie zijn taken heeft gedaan, dan zal hij de resultaten terug geven aan createServer(). Het werken met callbacks is een Javascript concept, die veelgebruikt wordt in node.js.

Er zijn twee parameters: ‘request’ & ‘response’. De server verwacht een request en zal een reponse met data geven aan de client: een head (status code + type file) en de body (de html).

Als laatste zullen we de server moeten laten luisteren naar een bepaalde poort, in dit geval poort 2000.

3. Uitvoeren en testen

Om de applicatie te testen, open een terminal en browse naar de folder ‘testnode’. Enter vervolgens ‘node hellotest.js’

Wanneer je nu een browser opent en navigeert naar http://localhost:2000 krijg je de response html te zien:

Als je wijzigingen aanbrengt in de response, dan zal je de node server moeten herstarten: onderbreek het proces in je terminal met ctr+c en herstart hem:

4. Modules - de Node Package Manager (NPM)

Via npm kan je modules installeren en beheren in Node.js, deze kan je vinden op http://npmjs.org. Npm is tevens het commando in je terminal, waarmee je modules kunt kunt beheren. Type maar eens ‘npm’. Je krijgt dan instructies te zien in je terminal.

Package.json

Het beheren van informatie (author, version, module dependencie, etc) over je project gebeurt in de package.json file. Die kan je genereren door commando ‘npm init’ uit te voeren. Na een serie van vragen zal de package.json file aangemaakt worden:

Npm modules kunnen stand-alone gebruikt worden, maar ook als een dependencies van jouw node.js project. Wanneer je bijvoorbeeld Grunt wilt installeren, type: “npm install grunt --save”. Je ziet nu dat betreffende module files worden geplaatst en Grunt als een dependency aan je package.json toegevoegd wordt:

End of part 2

Je ziet dat het relatief makkelijk is om een eenvoudige Node.js applicatie te maken, als je goed bekend bent met Javascript. Maar de Node.js core methods zijn erg sumier, je wilt uiteraard geen complete dynamische website bouwen met alleen dit soort request/response functies.

Hiervoor ga ik in het volgende deel verder verdiepen op Express JS: een web framework voor node.js die vele ingebouwde tools heeft om een website mee te bouwen.

Tevens laat ik in volgend deel zien hoe je de dynamische data uit de RESTful Drupal API kunt implementeren in Node.js / ExpressJS.

Lees verder in deel 3 >

Op de hoogte blijven?

Wees de eerste die nieuwe, relevante content leest,

we zullen nooit spammen of je e-mail adres delen.

Digitale Strategie en Realisatie

Kunnen wij helpen? Bel ons op 020 - 261 14 99,

mail ons op hallo@luciuswebsystems.nl, of stuur ons een bericht:

Zij gingen je voor: