go-ike / ike

1 stars 1 forks source link

New express router #2

Open mateusnroll opened 7 years ago

mateusnroll commented 7 years ago

The current routing capabilities the default express router has are not enough for robust web applications. Although it's powerful, it's too verbose at times.

Each route needs you to require and instantiate the controller, and then apply a class method to a route. That method needs to accept req and res, and then everything works. Like this:

// Require everything
const express = require('express');
const r       = express.Router();

// Samples
let SamplesController = new (require('controllers/samples.controller.js'))();
r.get   ('/samples',      SamplesController.index   );
r.post  ('/samples',      SamplesController.create  );
r.get   ('/samples/new',  SamplesController.show    );
r.get   ('/samples/edit', SamplesController.edit    );
r.put   ('/samples',      SamplesController.update  );
r.delete('/samples',      SamplesController.destroy );

Rails' router does a great job at this, a couple lines can get a lot done. Getting inspiration from there, this is what we should have on ike. Node ActionRouter by Jared Hanson is a great inspiration on how to get it done.

Match routes without requiring the controllers

Avoid importing files, since we know where they are. Let the user describe them as easily as possible.

routes.match('samples/:id', { controller: 'samples', action: 'show' });

Or, even simpler, use a string format to get to it:

routes.match('samples/:id', 'samples#show');

Middlewares can be declared inline, without interrupting the readability:

routes.match('samples/:id', { controller: 'samples', action: 'show', middleware: [middleware, anotherMiddleware] });
// Or the short way
routes.match('samples/:d', 'samples#show', [middleware, anotherMiddleware]);

Resource mapping

Common resources share the basic functionality. Having to declare all properties might be cumbersome, and a helper can get that job done.

routes.resources('samples');

This would map to:

Method Path Action
GET /samples index
GET /samples/new new
POST /samples create
GET /samples/:id show
GET /samples/:id/edit edit
PUT /samples/:id update
DELETE /samples/:id destroy

Helpers for links

Providing helpers to deal with linking is the ideal way, since it keeps the views or controllers from hardcoding it. Changing the route on the routes file is enough to update it everywhere.

samplesPath('1b23ef'); // Would return /samples/1b23ed
mateusnroll commented 7 years ago

Ike-router v1.0.0 is up! Check it at: https://github.com/go-ike/ike-router

@go-ike/main Can someone take a look at it?

niightly commented 7 years ago

@mateusnroll I did take a look and raise an issue there (also put a PR to you)