✈️ Express Marshal
A suite of decorators built to wire up express controllers
Install
$ npm install express express-marshal
Make sure you have decorators enabled through babel:
$ npm install --save-dev @babel/plugin-proposal-decorators
Add the plugin to your .babelrc:
{
"plugins": [
["@babel/plugin-proposal-decorators", { "legacy": true }]
]
}
Example
import express, { Router } from 'express'
import { mount, controller, param, validate, get, post } from 'express-marshal';
import Joi from 'joi';
@controller('/users')
class UserController {
@param('id')
preloadUser(req, res, next, id) {
const user = UserService.find({ id });
if (!user) {
res.sendStatus(404);
return;
}
req.user = user;
next();
}
@get('/', [authenticator])
getUsers(req, res) {
res.json({ users: [] });
}
@get('/:id')
getUser(req, res) {
res.json({
user: req.user
});
}
@validate({
email: Joi.string().required(),
password: Joi.string().required()
})
@post('/')
createUser(req, res) {
res.json({ users: [] });
}
}
const app = express()
const router = new Router();
mount(router, [UserController]);
app.use(router);
app.listen(process.env.PORT || 3000);
API
mount(router, [controllers])
import express, { Router } from 'express';
import { mount } from 'express-marshal';
const app = express()
const router = new Router();
mount(router, [UserController]);
app.use(router);
app.listen(3000);
@controller(basepath, middleware)
import { controller, get } from 'express-marshal';
@controller('/example')
export default class ExampleController {
...
}
@route(method, path, middleware)
-
method: String
The desired HTTP method (get, post, etc.)
-
path: String
The endpoint to be appended to the parent controller's basepath
-
middleware: Array
optional
Array of middleware only to be run for this route
Route Aliases
@get(path, middleware)
@post(path, middleware)
@put(path, middleware)
@patch(path, middleware)
@delete(path, middleware)
These are less verbose aliases for @route(method, path)
so you can use @get('/revoke')
instead of @route('get', '/revoke')
.
import { controller, get } from 'express-marshal';
@controller('/docs')
export default class DocsController {
@get('/')
index() {
...
}
}
@validate(schema)
import { controller, validate, post } from 'express-marshal';
import Joi from 'joi';
@controller('/users')
export default class UsersController {
@validate({
username: Joi.string().required()
})
@post('/')
createUser() {
...
}
}
Inspiration
License
MIT © Kyle Alwyn