Node.JS: Real-time awesomeness

Jonathan
module
Node.js
real-time
Drupal
Drupal 8

In deze blogpost zal ik jou wat meer vertellen over node.js en hoe deze te installeren en te gebruiken met Drupal. Node.js is een open-source, cross-platform runtime omgeving en het biedt een event-driven architectuur aan. De non-blocking I/O API optimaliseert de schaalbaarheid en throughput . Node.js is ideaal voor real-time updates, het is enorm snel en heel licht. En ja, het maakt gebruik van JavaScript. Dit is een enorm voordeel aangezien wij reeds weten hoe JavaScript te schrijven.

NODE.JE ALS HELD IN HET REAL-TIME VERHAAL

We maken gebruik van PHP om sommige acties te markeren en om real-time veranderingen te pushen met node.js naar gebruikers die een bepaalde pagina bekijken. Dit moet gebeuren zonder dat de gebruiker een pagina moet vernieuwVOORBEELen. Bij een van onze cases, een veilingsite met specifieke overzichtpagina’s,  moet elke prijs- en aflooptijd update gepushed worden zodat de bieder (gebruiker) onmiddellijk kan reageren en het gewenste item kan aankopen.
Doordat heel veel gebruikers constant en op hetzelfde moment pagina’s aan het vernieuwen zijn, zou dit ten koste van de laadtijd van de server zijn. Node.js was de perfecte oplossing om dit probleem te vermijden.

Nu zal ik je uitleggen hoe node.js te installeren en te connecteren met Drupal. Eerst en vooral toon ik jou hoe je een simpele custom module moet schrijven waarbij er een boodschap verschijnt op een pagina die wordt bekeken.

VOORBEELD

 De eerste stap is node.js installeren en te verbinden met Drupal. Voor deze verbinding maken we gebruik van de Node.js integration module.

In drush:

drush dl nodejs && drush en nodejs -y

Het ‘readme’ bestand van de module legt je uit hoe node.js te installeren maar ik lijst het hier voor je op:

Node.js integration

===================

This module adds Node.js integration to Drupal.
 

Setup

=====

 

1. Install Node.js.

1a. Install from a package manager:

https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

1b. Build from source on Ubuntu (and probably Debian):

NOTE: replace the 'x' in v0.8.x with the current latest stable version.

sudo apt-get install build-essential git curl openssl libssl-dev

mkdir -p ~/local/src

 cd ~/local/src

 git clone --branch v0.8.x git://github.com/joyent/node.git

 cd node

 ./configure

 make

 sudo make install

2. Install required Node.js modules with the Node Package Manager (NPM).

OPTIONAL: install node-gyp, so that the ws package is faster.

npm install -g node-gyp

Make sure you are in the nodejs module directory - NPM needs the package.json

file that comes with the nodejs module to install the right modules.

 

 cd path/to/your/nodejs/module/directory

 npm install

3. Create a 'nodejs.config.js' file in your nodejs module directory.

Read the 'nodejs.config.js.example' file. A basic configuration can be as simple as:

settings = {

 host: '*',

 serviceKey: 'CHANGE ME',

 backend: {

   port: 80,

   host: 'CHANGE ME TO THE HOSTNAME OF YOUR DRUPAL SITE',

   scheme: 'http',

   basePath: '',

   messagePath: '/nodejs/message'

 },

 debug: true

};

 

Set debug to false when you are happy with your setup.

4. Run the node server with the command: node server.js

As long as you have 'debug: true' in your configuration file, you'll see lots of helpful messages.

Punt vier in de readme file vertelt je wat over een server.js bestand, dit bestand bevindt zich in de module. Indien de bovenstaande uitleg niet voldoende is kan je doorklikken naar de volgende link waar je de regelmatig geüpdatet documenten over de module kan terugvinden.

https://www.drupal.org/node/1713530

Eenmaal je zowel Node.js intergration en Node.js hebt geïnstalleerd is het tijd om deze module te configureren. Je gaat naar YourSite/admin/config/nodejs/config en vult de details in die je hebt ingevoerd in nodejes.config.js. 

nodejs-config.PNG

Het zou kunnen dat je de node server moet heropstarten met het commando : node server.js in jouw terminal.

Tot nu toe hebben we de Node.js integration module en  node.js zelf geïnstalleerd én de verbinding met Drupal gemaakt. Je mag trots zijn op jezelf! Laten we nu een blik werpen op de custom module. We gaan onderzoeken hoe wij deze module kunnen aanmaken en deze dan uiteindelijk kunnen gebruiken in jouw website.

Je maakt een folder my_nodejs_module aan in de map sites/all/modules/custom.
In deze nieuwe folder maak je dan de info, install en module bestanden aan.

my_nodejs_module.info:

name = My custom node.js module
description = Implement realtime node.js updates on content updates.
package = Dropsolid
core = 7.x
dependencies[] = nodejs

Zoals je ziet is dit een standaard info bestand die afhankelijkheid is van de Node.je integration module.

my_nodejs_module.install:

<?php



/**

* @file

* Install functionality for my_nodejs_module module.

*/



/**

* Implements hook_install().

*

* Sets up nodejs configuration.

*/

function my_nodejs_module_install() {

 $nodejs_config = array(

   'nodejs_notify_notification_lifetime_seconds' => 3,

   'nodejs_pages' => '*',

   'nodejs_server_host' => ‘127.0.0.1’,

   'nodejs_server_port' => '80',

   'nodejs_server_scheme' => 'http',

   'nodejs_service_key' => '',

 );



 foreach ($nodejs_config as $variable_name => $variable_value) {

   variable_set($variable_name, $variable_value);

 }

}

 

Merk op dat de instellingen hetzelfde zijn als deze in YourSite/admin/config/nodejs/config.
Nu komen we tot de kern van de zaak.

 

my_node_module.module:

<?php



/**

* Implements hook_node_view().

*/

function my_nodejs_module_node_view($node, $view_mode, $langcode) {

 if (isset($node->type) && $node->type == ’page’) {

   $content_channel = ’page_node_channel’;

   nodejs_send_content_channel_token($content_channel);

   drupal_add_js(drupal_get_path('module', 'my_nodejs_module') . '/js/my_nodejs_module.js', array('type' => 'file'));

 }

}



/**

* Implements hook_node_update()

*/

function my_nodejs_module_node_update($node) {

 if ($node->type == 'page') {



   $nid = $node->nid;

   $message_text = ’This page was just updated with node.js.’;

   $data = array(

      ’message_text’ => $message_text,

   );

   $content_channel = 'page_node_channel';

   $message = (object) array(

     'channel' => $content_channel,

     'callback' => 'myCustomCallback',

     'data' => $data,

   );



   nodejs_send_content_channel_message($message);


 }

 

In hook_node_view() plaatsen we een content channel voor een pagina wanneer een pagina wordt bekeken. We zullen dit channel nodig hebben zodat node.js data kan pushen naar de pagina’s die worden bekeken. Daarnaast gaan we ons custom.js bestand hier toevoegen (dit is het volgende dat we ontwikkelen). In de hook_node_update() gaan we reageren telkens wanneer een pagina is geüpdatet. Zo verkrijgen we alle informatie dat wij nodig hebben en zorgen we ervoor dat node.js data doorstuurt naar de bekeken pagina’s op dat moment. Indien we willen  dat node.js effectief iets zal veranderen moeten we wat JavaScript neerschrijven. Maak een map genaamd ‘js’ aan in de module folder. In deze ‘js’ map maak je een JavaScript bestand aan genaamd ‘my_nodejs_module.js’. Laten we nu wat code toevoegen (meerbepaald jQuery in dit geval):

 

my_nodejs_module.js:

(function ($) {

 Drupal.Nodejs.callbacks.myCustomCallback = {

   callback: function (message) {

     var message = message.data.message_text;

     jQuery('#some-message-container').replaceWith(message);

   }

 };

}(jQuery));

 

We laten node.js reageren op de callback genaamd ‘myCustomCallback’ die we in hook_node_update() plaatsten. We kunnen meer callbacks gebruiken in verschillende situaties mocht dit gewenst zijn, maar dat is niet van toepassing in dit voorbeeld. We krijgen de boodschap die we verzenden vanuit hook_node_update(), we vervangen de ID ‘some-message-container’ in onze html pagina door de boodschap die we hebben ontvangen in het ‘js’ bestand.

Dit is uiteraard een heel gemakkelijk voorbeeld maar het toont jou één van de mogelijkheden van Drupal en Node.js. Het enige dat wij nu moeten doen is onze module activeren en de caches clearen. Laten we een paar voorbeelden bekijken waarvoor Node.js kan gebruikt worden. Het voorbeeld hierboven is maar slechts het topje van de ijsberg.

Node specialiseert zich in het bezorgen van data. Node is niet gemaakt voor zware berekeningen maar zal veel data snel kunnen aanleveren.  

 

ER HANGT NODE.JS IN DE LUCHT

Chat.
Chat is een alombekend voorbeeld voor het gebruik van Node.js. Het is real-time, data intensief en het gaat om verschillende gebruikers. Het typische één-naar-veel input ouput systeem is een geschikt voorbeeld voor Node.js.

Data streaming
Dit is nog een mooi voorbeeld van het overzetten van veel data gelijktijdig naar verschillende gebruikers. Met de hulp van Node.js kan men audio en video streaming perfect sturen en controleren.

Social networking
Er zijn er weinigen die vandaag de dag niet actief bezig zijn met dit principe. Ze posten, updaten en delen dit met duizenden andere mensen. Je bent ambitieus en wil het nieuwe sociale netwerk uitvinden? Node.js is jouw ideale partner om dit te realiseren.

Real-time monitoring
Dankzij Node.js is het mogelijk om de bezoekers van jouw website te volgen. Je kan hun beweging perfect volgen. Het is zelf mogelijk om actief te communiceren met jouw bezoekers vanaf een bepaalde fase in de sales funnel. Een mooi voorbeeld hiervan is Live Chat.

Online bieden en veilingen.
Wij gebruiken het reeds op http://openbare-verkopen.be om real-time bieden te realiseren. Eenmaal een gebruiker een bod plaatst,  wordt dit geüpdatet op alle open verbindingen. De gebruikers die op dat moment online zijn krijgen deze update onmiddelijk. Op deze manier wordt er gezorgd voor schaalbaarheid en snelle biedingen.

 

Zoals je kan zien zijn er heel wat interessante cases. Er zijn veel meer mogelijkheden om Drupal te verbinden met Node.js en te zorgen voor krachtige real-time services.

Ik hoop dat je hebt genoten van dit artikel en overtuigd bent van het feit dat Node.js meer is dan zomaar een module. Bekijk gerust onze andere blog posts eens voor nog meer interessante weetjes.

Populaire blogposts
Drupal Mythes
Wat betekent Drupal 8 voor uw business?
Schrijven voor het web met de juiste keywords, gebruik Google Keyword Planner
Fairtrade Belgium bouwt eigen subsites
Is branding enkel het logo van mijn bedrijf?