Skip to content

Express Router inspired by ZEIT's Micro controllers style.

Notifications You must be signed in to change notification settings

ali-essam/macropress-router

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Macropress Router

npm version Dependencies

Express Router inspired by ZEIT's Micro controllers style.

Install

# Using npm
$ npm install macropress-router

# Or using yarn
$ yarn add macropress-router

Why?

If you're using express to build a JSON API while using async/await syntax, then dealing with express callback style will force you to add some boilerplate code in each controller.

const myController = async (req, res, next) => {
  try {
    data = await some_code()
    return res.status(200).json(data)
  } catch (err) {
    return next(err)
  }
}

expressRouter.get('/', myController)

What does macropress-router do?

It's a bit opinionated implementation inspired by zeit's micro that allows you to get rid of the boilerplate code. So you can do the same functionality with less code.

const myController = async (req, res) => {
  data = await some_code()
  return data
}

macropressRouter.get('/', myController)

Behaviour

Macropress overrides express router methods to automatically wrap async controllers with the boilerplate code so you don't have to do it manually

  • If the controller returns a JSON serializable object it will call res.json on the return with a default status code 200
  • If the controller returned undefined or null, it will respond with statuc code 204
  • If the controller failed with any error, it will pass it to next
  • If the controller already handled its logic by calling res.send or next, it will respect the controller and do nothing

Overriden methods

[
  'checkout', 'copy', 'delete', 'get', 'head', 'lock', 'merge', 'mkactivity',
  'mkcol', 'move', 'm-search', 'notify', 'options', 'patch', 'post', 'purge',
  'put', 'report', 'search', 'subscribe', 'trace', 'unlock', 'unsubscribe'
]

If for some reason you need to use the original methods they're accessible using ${methodName}Sync (ex: getSync)

Example

const MacropressRouter = require('macropress-router')
const express = require('express')

const app = express()
const router = new MacropressRouter()

const getData = async () => {
  return { hello: 'world' }
}

const myController = async (req, res) => {
  const data = await getData()
  return data
}

router.get('/', myController)

app.use(router)

app.listen()