Slide 1

Slide 1 text

Comparison NodeJS frameworks [email protected] @abtris www.praguejs.cz @jsconfcz

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

express koa hapi github stars 18861 6174 4228 contributors 178 59 116 downloads / w 525941 8769 11966 stack overflow 14853 138 66 npm -ls | wc -l 48 36 48 file size 3896 2000 50392

Slide 4

Slide 4 text

http://docs.nodeschoolhk.apiary.io/

Slide 5

Slide 5 text

https://github.com/apiaryio/dredd

Slide 6

Slide 6 text

Init server

Slide 7

Slide 7 text

"express": "^4.12.3" (function() { 'use strict'; var express = require('express'); var app = express(); app.set('json spaces', 2); .... var server = app.listen(3003, function() { var host = server.address().address; var port = server.address().port; console.log('Example app listening at http://%s:%s', host, port); }); }());

Slide 8

Slide 8 text

"hapi": "^8.4.0" var Hapi = require('hapi'); var server = new Hapi.Server(); server.connection({port: 3001}); .... // Start the server server.start(function() { console.log('Server running at:', server.info.uri); });

Slide 9

Slide 9 text

"koa": "^0.20.0" "use strict"; var koa = require('koa'); var route = require('koa-route'); var app = koa(); require('koa-qs')(app); .... app.listen(3000);

Slide 10

Slide 10 text

Routing

Slide 11

Slide 11 text

"express": "^4.12.3" app.get('/questions/:question_id', function(req, res) { res.status(200).json({"question":"Favourite programming language?"...}]}); }); app.post('/questions/:question_id/choices/:choice_id', function(req, res) { res.set('Location', '/questions/' + req.params.question_id); res.status(201).send(''); });

Slide 12

Slide 12 text

"hapi": "^8.4.0" server.route({ method: 'GET', path: '/questions/{question_id}', handler: function(request, reply) { reply({"question":"Favourite programming language?"...}); } }); server.route({ method: 'POST', path: '/questions/{question_id}/choices/{choice_id}', handler: function(request, reply) { reply().code(201).header('Location', '/questions/' + request.params.question_id); } });

Slide 13

Slide 13 text

"koa": "^0.20.0" app.use(route.get('/questions/:question_id', function *(question_id) { this.body = {"question":"Favourite programming language?"...}; })); app.use(route.post('/questions/:question_id/choices/:choice_id', function *(question_id, choice_id) { this.status = 201; this.set('Location', '/questions/' + question_id); this.body = ''; }));

Slide 14

Slide 14 text

Testing • Dredd var hooks = require('hooks'); var before = hooks.before; hooks.beforeEach(function(transaction) { if (transaction.expected.headers['Content-Type'] == 'application/json') { transaction.expected.headers['Content-Type'] = 'application/json; charset=utf-8'; } });

Slide 15

Slide 15 text

Github repository of project: https://github.com/abtris/nodeschool-hk-2015-05-23 Ideas how project improve: • you can fork and contribute • you can try add 404, 500 pages • you can try persistent layer using Redis