Cómo funcionan app.listen () y app.get () en Express y hapi

Con el módulo de nodo http (solo módulos nativos), puedo recrear app.listen () y app.get () usando el módulo http con un constructor

var app = function(opts) { this.token= opts.token } app.prototype.get = function(callback) { // use request and response of app.listen() } app.prototype.active = function(callback) { // use request and response of app.listen() // return on callback some manipulate //request params } app.prototype.listen = function() { // start http or https server } 

Importa los módulos y trabaja con esto.

 var app = require(...) Var client = new app({ token: 0000 }) client.get(function(error, reply) {}) client.listen() 

Es bastante fácil construir su propio marco HTTP muy simple sobre el módulo http de Node. Aquí hay uno rápido que hice que implementa los app.get() y app.listen() , puedes ver cómo podría crecer para convertirse en algo más parecido a Express:

 'use strict'; const Http = require('http'); const Url = require('url'); // Framework const Framework = function (options) { this.options = options; this.routes = []; this.listener = Http.createServer(this._onRequest.bind(this)); }; Framework.prototype.get = function (path, handler) { this.routes.push({ path, method: 'GET', handler }); }; Framework.prototype.post = function (path, handler) { this.routes.push({ path, method: 'POST', handler }); }; Framework.prototype.listen = function (callback) { this.listener.listen(this.options.port, callback); }; Framework.prototype._onRequest = function (req, res) { // Find the first matching route for (let i = 0; i < this.routes.length; ++i) { const route = this.routes[i]; const url = Url.parse(req.url); if (route.method === req.method && url.path === route.path) { return route.handler(req, res); } } // No matching routes res.writeHead(404); res.end('Not found'); }; 

Puedes usar este mini framework así:

 const app = new Framework({ port: 4000 }); app.get('/', (req, res) => { res.end('Home page'); }); app.get('/about', (req, res) => { res.end('About page'); }); app.listen(() => { console.log('Started server!'); }); 

Puedes probarlo con algunas solicitudes de cURL:

 $ curl -i http://localhost:4000/ HTTP/1.1 200 OK Date: Sun, 24 Apr 2016 14:38:02 GMT Connection: keep-alive Content-Length: 9 Home page $ curl -i http://localhost:4000/about HTTP/1.1 200 OK Date: Sun, 24 Apr 2016 14:38:08 GMT Connection: keep-alive Content-Length: 10 About page $ curl -i http://localhost:4000/spaghetti HTTP/1.1 404 Not Found Date: Sun, 24 Apr 2016 14:38:14 GMT Connection: keep-alive Transfer-Encoding: chunked Not found 

Obviamente, este es un marco realmente básico y tiene muchos problemas que han solucionado los marcos como hapi:

  • No hay soporte para los parámetros en las rutas, por ejemplo, /users/{id} . Las rutas URL deben coincidir exactamente con la ruta
  • El orden en que se agregan las rutas es importante (esto puede llevar a problemas)
  • Se permiten caminos conflictivos.
  • Falta muchas características interesantes, como servir archivos y plantillas de representación (aunque puede hacerlo manualmente en los controladores)