Giter VIP home page Giter VIP logo

micro-router's Introduction

๐Ÿš‰ Micro Router - A tiny and functional router for ZEIT's micro

GitHub release Build Status Coveralls Codacy Badge

๐Ÿ‘Œ ย  Features

  • Tiny. Just couple lines of code.
  • Functional. Write your http methods using functions.
  • Async. Design to use with async/await

๐Ÿ’ป ย  Usage

Install as project dependency:

$ yarn add microrouter

Then you can define your routes inside your microservice:

const { send } = require('micro')
const { router, get } = require('microrouter')

const hello = (req, res) => send(res, 200, `Hello ${req.params.who}`)

const notfound = (req, res) => send(res, 404, 'Not found route')

module.exports = router(get('/hello/:who', hello), get('/*', notfound))

async/await

You can use your handler as an async function:

const { send } = require('micro')
const { router, get } = require('microrouter')

const hello = async (req, res) =>
  send(res, 200, await Promise.resolve(`Hello ${req.params.who}`))

module.exports = router(get('/hello/:who', hello))

route methods

Each route is a single basic http method that you import from microrouter and has the same arguments:

  • get(path = String, handler = Function)
  • post(path = String, handler = Function)
  • put(path = String, handler = Function)
  • patch(path = String, handler = Function)
  • del(path = String, handler = Function)
  • head(path = String, handler = Function)
  • options(path = String, handler = Function)

path

A simple url pattern that you can define your path. In this path, you can set your parameters using a : notation. The req parameter from handler will return these parameters as an object.

For more information about how you can define your path, see url-pattern that's the package that we're using to match paths.

handler

The handler method is a simple function that will make some action base on your path. The format of this function is (req, res) => {}

req.params

As you can see below, the req parameter has a property called params that represents the parameters defined in your path:

const { router, get } = require('microrouter')
const request = require('some-request-lib')

// service.js
module.exports = router(
  get('/hello/:who', (req, res) => req.params)
)

// test.js
const response = await request('/hello/World')

console.log(response)  // { who: 'World' }
req.query

The req parameter also has a query property that represents the queries defined in your requision url:

const { router, get } = require('microrouter')
const request = require('some-request-lib')

// service.js
module.exports = router(
  get('/user', (req, res) => req.query)
)

// test.js
const response = await request('/user?id=1')

console.log(response)  // { id: 1 }

Parsing Body

By default, router doesn't parse anything from your requisition, it's just match your paths and execute a specific handler. So, if you want to parse your body requisition you can do something like that:

const { router, post } = require('microrouter')
const { json, send } = require('micro')
const request = require('some-request-lib')

// service.js
const user = async (req, res) => {
  const body = await json(req)
  send(res, 200, body)
}

module.exports = router(
  post('/user', user)
)

// test.js
const body = { id: 1 }
const response = await request.post('/user', { body })

UrlPattern instance as path

The package url-pattern has a lot of options inside it to match url. If you have a different need for some of your paths, like a make pattern from a regexp, you can pass an instance of UrlPattern as the path parameter:

const UrlPattern = require('url-pattern')
const { router, get } = require('microrouter')

const routes = router(
  get(
    new UrlPattern(/^\api/),
    () => 'This will match all routes that start with "api"'
  )
)

Namespaced Routes

If you want to create nested routes, you can define a namespace for your routes using the withNamespace high order function:

const { withNamespace, router, get } = require('microrouter')
const { json, send } = require('micro')

const oldApi = withNamespace('/api/v1')
const newApi = withNamespace('/api/v2')

const routes = router(
  oldApi(get('/', () => 'My legacy api route')),
  newApi(get('/', () => 'My new api route'))
)

PS: The nested routes doesn't work if you pass a UrlPattern instance as path argument!

๐Ÿ•บ ย  Contribute

  1. Fork this repository to your own GitHub account and then clone it to your local device
  2. Install dependencies using Yarn: yarn install
  3. Make the necessary changes and ensure that the tests are passing using yarn test
  4. Send a pull request ๐Ÿ™Œ

micro-router's People

Contributors

pedronauck avatar minigod avatar mingz-work avatar leo avatar brunolemos avatar timneutkens avatar danielruf avatar brendancwood avatar fdaciuk avatar flamefork avatar johanbrook avatar megamaddu avatar ulken avatar shidhincr avatar timreynolds avatar

Watchers

Rajesh Pillai avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.