Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jblaak/express-torch
Expressive and maintainable routes for Express.js
https://github.com/jblaak/express-torch
express routing
Last synced: about 2 months ago
JSON representation
Expressive and maintainable routes for Express.js
- Host: GitHub
- URL: https://github.com/jblaak/express-torch
- Owner: JBlaak
- Created: 2016-10-29T13:39:14.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2018-03-22T10:12:10.000Z (almost 7 years ago)
- Last Synced: 2024-10-30T22:25:53.256Z (about 2 months ago)
- Topics: express, routing
- Language: TypeScript
- Homepage:
- Size: 142 KB
- Stars: 51
- Watchers: 3
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Express Torch
=====[![Build Status](https://travis-ci.org/JBlaak/Express-Torch.svg?branch=master)](https://travis-ci.org/JBlaak/Express-Torch)
Expressive and maintainable routes for Express.js.
Running the example
-----The project includes a simple example rendering a `/` and `/api/posts` endpoint,
you can set it up as follows:```bash
$ cd ./example
$ yarn
$ yarn start
```Now visit `http://localhost:3000` and take a look at `server.js`!
Usage
-----__Basic usage__
You pass your Express app to Torch, and a callback in which you can
specify your routes.```js
import Express from 'express';
import Torch from 'express-torch';
import HomeController from './controllers/home';const app = Express();
Torch(app, (router) => {
router.get('/', HomeController.index);
});//... your other Express logic
app.listen(3000);
```__Grouping__
This is where Torch shines, you can register a bunch of routes
that require all parameters of the groups above, such as a `prefix` for
your `/api` routes.```js
import Express from 'express';
import Torch from 'express-torch';
import HomeController from './controllers/home';const app = Express();
Torch(app, (router) => {
router.get('/', HomeController.index);
router.group({prefix: 'api'}, (router) => {
router.get('/posts', HomeController.index);// will evaluate to /api/posts
router.get('/posts/:id', HomeController.show);// will evaluate to /api/posts/:id
});
});//... your other Express logic
app.listen(3000);
```__Middleware__
Groups have another advantage, you can apply regular Express middleware to them,
so that they stack together without you having to specify them per route```js
import Express from 'express';
import Torch from 'express-torch';
import HomeController from './controllers/home';const app = Express();
Torch(app, (router) => {
router.group({middlware: [Cookies, Session]}, (router) => {
router.get('/', HomeController.index);// Cookies > Session
router.group({middleware: [Throttle]}, (router) => {
router.get('/posts', HomeController.index);// Cookies > Session > Throttle
router.group({middleware: [OAuth, Policy('manage-posts')]}, (router) => {
router.get('/posts/:id', HomeController.show);// Cookies > Session > Throttle > OAuth > Policy('manage-posts')
});
});
});//... your other Express logic
app.listen(3000);
```if you want, you can still apply middleware to a single route
```js
import Express from 'express';
import Torch from 'express-torch';
import HomeController from './controllers/home';const app = Express();
Torch(app, (router) => {
router.get('/', {,
middleware: [Auth],
controller: HomeController.index
});
});//... your other Express logic
app.listen(3000);
```__Naming__
Since urls can be subject to your client's requests you don't want to spread
them all around your application as if they were static. Torch allows you to
add a mapping so that some `name` will map to a path.```js
import Express from 'express';
import Torch from 'express-torch';
import PostsController from './controllers/posts';const app = Express();
const routes = Torch(app, (router) => {
router.group({prefix: '/api'}, function(router) {
router.get('/posts/:id', {,
name: 'api.posts.show',
controller: PostsController.show
});
});
});routes.named('api.posts.show', { id: 123 });// will evaluate to /api/posts/123
//... your other Express logic
app.listen(3000);
/**** in ./controllers/posts.js ****/
{
index: (req, res) => {
req.routes.named('api.posts.show', {id: 123})
}
}
```__Constraints__
Most of the time we want to constrain our routes their variables, for example an `:id` should in some applications only match a number. Express allows us to use regex inside a route path but those make the route look bloated and hard to read. To still be able to constrain our routes but still keep them readable Torch allows us to define the constraints in an extra method.
```js
import Express from 'express';
import Torch from 'express-torch';
import PostsController from './controllers/posts';const app = Express();
const routes = Torch(app, (router) => {
router.group({prefix: '/api'}, function(router) {
router.get('/posts/:id', PostsController.show).where({'id', '(\\d+)'}); // will evaluate to /api/posts/:id(\\d+)
});
});//... your other Express logic
app.listen(3000);
```