express-marshal v1.1.2
✈️ Express Marshal 
 
 
 
A suite of decorators built to wire up express controllers
Install
$ npm install express express-marshalMake sure you have decorators enabled through babel:
$ npm install --save-dev @babel/plugin-proposal-decoratorsAdd 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 {
  // Add route parameters
  @param('id')
  preloadUser(req, res, next, id) {
    const user = UserService.find({ id });
    if (!user) {
      res.sendStatus(404);
      return;
    }
    req.user = user;
    next();
  }
  // Add route-specific middleware
  @get('/', [authenticator])
  getUsers(req, res) {
    res.json({ users: [] });
  }
  // Use the previously specified param
  @get('/:id')
  getUser(req, res) {
    res.json({
      user: req.user
    });
  }
  // Validate user paylaods with Joi
  @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])
router: Express#RouterAn Express router
controllers: ArrayArray of decorated 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)
basepath: StringThe basepath will be prepended to all controller routes
middleware: ArrayoptionalMiddleware to be run for every route on the controller
import { controller, get } from 'express-marshal';
@controller('/example')
export default class ExampleController {
  ...
}@route(method, path, middleware)
method: StringThe desired HTTP method (get, post, etc.)
path: StringThe endpoint to be appended to the parent controller's basepath
middleware: ArrayoptionalArray 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)
schema: Object|JoiA generic object containing Joi properties or a preconfigured Joi schema to validate an incoming payload against. A generic object will be converted to a Joi schema upon validation. A
GETrequest will validate thereq.queryobject while aPOSTrequest will validate thereq.queryobject. Returns a 400 along with the Joi error if payload is invalid.
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
- https://github.com/stewartml/express-decorators
 - https://github.com/knownasilya/hapi-decorators
 - https://github.com/serhiisol/node-decorators/tree/master/express
 
License
MIT © Kyle Alwyn