- Notifications
You must be signed in to change notification settings - Fork34
🚉 A tiny and functional router for Zeit's Micro
License
pedronauck/micro-router
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
🚉Micro Router - A tiny and functional router for ZEIT'smicro
- Tiny. Just couple lines of code.
- Functional. Write your http methods using functions.
- Async. Design to use with
async/await
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')consthello=(req,res)=>send(res,200,`Hello${req.params.who}`)constnotfound=(req,res)=>send(res,404,'Not found route')module.exports=router(get('/hello/:who',hello),get('/*',notfound))
You can use your handler as an async function:
const{ send}=require('micro')const{ router, get}=require('microrouter')consthello=async(req,res)=>send(res,200,awaitPromise.resolve(`Hello${req.params.who}`))module.exports=router(get('/hello/:who',hello))
Each route is a single basic http method that you import frommicrorouter
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)
A simple url pattern that you can define your path. In this path, you can set your parameters using a:
notation. Thereq
parameter fromhandler
will return these parameters as an object.
For more information about how you can define your path, seeurl-pattern that's the package that we're using to match paths.
Thehandler
method is a simple function that will make some action base on your path.The format of this function is(req, res) => {}
As you can see below, thereq
parameter has a property calledparams
that represents the parameters defined in yourpath
:
const{ router, get}=require('microrouter')constrequest=require('some-request-lib')// service.jsmodule.exports=router(get('/hello/:who',(req,res)=>req.params))// test.jsconstresponse=awaitrequest('/hello/World')console.log(response)// { who: 'World' }
Thereq
parameter also has aquery
property that represents thequeries
defined in your requision url:
const{ router, get}=require('microrouter')constrequest=require('some-request-lib')// service.jsmodule.exports=router(get('/user',(req,res)=>req.query))// test.jsconstresponse=awaitrequest('/user?id=1')console.log(response)// { id: 1 }
By default, routerdoesn'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')constrequest=require('some-request-lib')// service.jsconstuser=async(req,res)=>{constbody=awaitjson(req)send(res,200,body)}module.exports=router(post('/user',user))// test.jsconstbody={id:1}constresponse=awaitrequest.post('/user',{ body})
The packageurl-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 ofUrlPattern
as the path parameter:
constUrlPattern=require('url-pattern')const{ router, get}=require('microrouter')constroutes=router(get(newUrlPattern(/^\api/),()=>'This will match all routes that start with "api"'))
If you want to create nested routes, you can define a namespace for your routes using thewithNamespace
high order function:
const{ withNamespace, router, get}=require('microrouter')const{ json, send}=require('micro')constoldApi=withNamespace('/api/v1')constnewApi=withNamespace('/api/v2')constroutes=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!
About
🚉 A tiny and functional router for Zeit's Micro