Although there are many express js route grouping packages, there is no grouping package with dynamic parameter holders feature. Beside Resource API Model approach has been integrated in this package basically.
NPM
$ npm i express-route-grouping --save
Yarn
$ yarn add express-route-grouping
import { Router } from 'express';
import RouteGroup from 'express-route-grouping';
const root = new RouteGroup('/', Router());
root.group('blogs', blogs => {
// -> /blogs
blogs.get('/', () => {});
blogs.group(':blogId', blog => {
// -> /blogs/:blogId
blog.get('/', (req, res) => {});
// -> /blogs/:blogId
blog.post('/', (req, res) => {});
// -> /blogs/:blogId/comments
blog.get('comments', (req, res) => {});
// -> /blogs/:blogId/likes
blog.get('likes', (req, res) => {});
});
});
app.use('/', root.export());
Not: You can nest all routes unlimitedly as above.
Resource api modeling is a approach to standarts some generic http operations.
Let's see the examples:
import { Router } from 'express';
import RouteGroup from 'express-route-grouping';
const root = new RouteGroup('/', Router());
root.group('products', products => {
products.resource({
handlers: {
// GET: /products
index(req, res) {},
// GET: /products/:productId
find(req, res) {},
// POST: /products
create(req, res) {},
// PUT: /products/:productId
update(req, res) {},
// PATCH: /products/:productId
patch(req, res) {},
// DELETE: /products/:productId
delete(req, res) {},
},
});
});
app.use('/', root.export());
You can also set a class instance including resource methods.
class BlogController {
// GET: /products
index = (req, res) => {};
// GET: /products/:productId
find = (req, res) => {};
// POST: /products
create = (req, res) => {};
// PUT: /products/:productId
update = (req, res) => {};
// PATCH: /products/:productId
patch = (req, res) => {};
// DELETE: /products/:productId
delete = (req, res) => {};
}
root.group('products', ({ resource }) => {
resource({
handlers: new BlogController(),
});
});
app.use('/', root.export());
Note: You don't have to add all methods to handlers. It will consider only the defined ones.
Name | Type | Description |
---|---|---|
handlers | Function/Function[] | This is main handler(s). It can pass multiple handlers. |
beforeHandlers | Function[] | Adds handlers to before main handlers. |
afterHandlers | Function[] | Adds handlers to after main handlers. |
import { Router } from 'express';
import RouteGroup from 'express-route-grouping';
const root = new RouteGroup('/', Router());
root.group('products', products => {
products.resource({
handlers: {
// -> index: (GET: /products)
// -> find: (GET: /products/:productId)
// -> create: (POST: /products)
// -> update: (PUT: /products/:productId)
// -> patch: (PATCH: /products/:productId)
// -> delete: (DELETE: /products/:productId)
},
});
products.group('items', items => {
items.resource({
handlers: {
// -> index: (GET: /products/:productId/items)
// -> find: (GET: /products/:productId/items/:itemId)
// -> create: (POST: /products/:productId/items)
// -> update: (PUT: /products/:productId/items/:itemId)
// -> patch: (PATCH: /products/:productId/items/:itemId)
// -> delete: (DELETE: /products/:productId/items/:itemId)
},
});
});
});
app.use('/', root.export());
$ npm test
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.