Node.js + Drupal Luca Lusso
Agenda Cos è e come funziona node.js Installare node.js Code session: realizzazione si un modulo per l autocompletamento dei tags Demo session: installare e usare il modulo nodejs
Cos è e come funziona node.js Javascript sul server Basato su V8 di Google (il motore javascript di Chrome) Event driven I/O asincrono (mediante librerie esterne)
Cos è e come funziona node.js Un singolo processo gestisce il main event loop e tutte le connessioni (singolo thread) I task sono eseguiti in modo asincrono lasciando il main event loop libero di gestire altre richieste Anche nginx usa lo stesso modello semplicemente perché per una concorrenza massiva non possiamo usare un thread del sistema operativo per ogni connessione, è troppo pesante.
Cos è e come funziona node.js node processo di I/O (lento) processo di I/O A B C
Node.js può essere usato per Gestire la concorrenza I/O asincrono Networking Caricamento asincrono di componenti di una pagina via Ajax
Installare node.js http://nodejs.org/ Ultima versione stabile (0.4.12) disponibile per ambienti Unix (Linux, Mac Os X) Versione unstable (0.5.x) aggiunge il supporto a Windows github.com/joyent/node/wiki/installation Per Mac Os X è disponibile l installer, per Linux basta scaricare e compilare :-)
Installare node.js NPM (Node Package Manager) Gestisce il download e l installazione delle librerie aggiuntive http://npmjs.org/ curl http://npmjs.org/install.sh sudo sh #> npm install express
Hello world (hello.js) var http = require('http'); http.createserver(function (request, response) { console.log('request received ); response.writehead(200, {'Content-Type': 'text/plain'}); response.end('hello World\n'); }).listen(8000); console.log('server running at http://127.0.0.1:8000/');
Hello world funkymac2:desktop lussoluca$ node hello.js Server running at http://127.0.0.1:8000/ Request received
Code session: realizzazione si un modulo per l autocompletamento dei tags Chiama Ajax per autocompletare i tags durante la digitazione Necessita un bootstrap completo di Drupal per gestire la richiesta /taxonomy/autocomplete/field_tags/a
Code session: realizzazione si un modulo per l autocompletamento dei tags express (http://expressjs.com) web framework per Node.js Nel nostro esempio usiamo solo il routing, ma fa anche middleware, template e altro mysql (github.com/felixge/node-mysql) driver MySQL per Node.js
Code session: realizzazione si un modulo per l autocompletamento dei tags var Client = require('mysql').client; var client = new Client(); client.user = 'root'; client.password = 'root'; client.port = 3306; client.database = 'nodejs';
Code session: realizzazione si un modulo per l autocompletamento dei tags var app = require('express').createserver(); app.get('/autocomplete/:vid/:id', function(req, res) {
Code session: realizzazione si un modulo per l autocompletamento dei tags var query = client.query( 'SELECT * FROM [...]', [vid, arg, tags.join(',')], function selectcb(err, results, fields) { if (err) { }); } throw err; var names = {}; var prefix = (tags.length > 0)? tags.join(',') + ', ' : ''; for (var i in results){ var result = results[i]; } names[prefix + result.name] = result.name; res.write(json.stringify(names)); res.end(); // end the request. Callback! Node.js non si ferma ad aspettare i risultati dal db, li invierà al client quando saranno pronti!
Code session: realizzazione si un modulo per l autocompletamento dei tags app.listen(3000);
Code session: realizzazione si un modulo per l autocompletamento dei tags
Code session: realizzazione si un modulo per l autocompletamento dei tags function _test() { $form = array(); $form['name_nodejs'] = array( '#type' => 'textfield', '#title' => t('tags Node.js version'), '#autocomplete_path' => '/autocomplete/1', '#size' => '100', '#maxlength' => '100', ); $form['name_drupal'] = array( '#type' => 'textfield', '#title' => t('tags drupal version'), '#autocomplete_path' => 'taxonomy/autocomplete/field_tags', '#size' => '100', '#maxlength' => '100', ); } return $form;
Code session: realizzazione si un modulo per l autocompletamento dei tags /autocomplete/1/% non è un path Drupal Necessario per bypassare il problema del cross domain scripting Bisogna configurare il mod_proxy di Apache (cosa simile per nginx)
Code session: realizzazione si un modulo per l autocompletamento dei tags <VirtualHost *:80> ServerAdmin webmaster@localhost ServerName www.example.it DocumentRoot /var/www/example <Directory /var/www/example> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> Nella configurazione del VirtualHost diciamo ad Apache di girare le richieste alla url autocomplete al server Node.js in ascolto sulla porta 3000 ProxyPass /autocomplete http://www.example.it:3000/autocomplete ProxyPassReverse /autocomplete http://www.example.it:3000/autocomplete </VirtualHost>
Code session: realizzazione di un modulo per l autocompletamento dei tags Node.js: 15ms Chiamata standard Drupal: 131ms
Demo session: installare e usare il modulo nodejs drupal.org/project/nodejs Ancora in versione beta Canali multipli per inviare messaggi asincroni a tutti i client connessi al sito a seconda dei ruoli/permessi Basato su Socket.io, express e connect
Demo session: installare e usare il modulo nodejs Il modulo nodejs_config fornisce un interfaccia per creare il file di configurazione per il server, nodejs.config.js che deve stare nella stessa directory del file server.js backendsettings = { "scheme":"http", "host":"localhost", "port":4000, "key":"/path/to/key/file", "cert":"/path/to/cert/file", "resource":"/socket.io", "publishurl":"/nodejs/publish", "servicekey":"", "backend":{ "port":8080, "host":"nodejs", [...]
Demo session: installare e usare il modulo nodejs nodejs_notify -> notifiche growl like nodejs_subscribe -> notifica cambiamenti nei contenuti nodejs_actions -> action per inviare messaggi, usabile anche da Rules
Demo session: installare e usare il modulo nodejs client Richiesta iniziale Risposta con token di autenticazione Drupal Invio token node Verifica autenticazione Lista canali Autenticazione riuscita Le chiamate successive non passano più da Drupal
Domande?!
Grazie!