Git Product home page Git Product logo

koa-66's Introduction

koa-66

Node.js Version NPM version build status Dependency Status Coverage Status

Router middleware for koa v2.

feedbacks are welcome

Features

  • Plugin middleware support
  • Express like http verbs methods (including all)
  • Express like use function
  • Express like param function
  • Automatic OPTIONS response
  • Automatic HEAD when GET is present
  • 501 and 405 status (throw capability with headers)
  • Mount instance on specific path
  • Multiple middleware as arguments
  • Multiple middleware as array

Installation

# npm install koa-66

Example

const Koa = require('koa');
const Router = require('koa-66');
const app = new Koa();

const router = new Router();
const mainRouter  = new Router();

router.param('id', (ctx, next, id) => {
        ctx.yolo = id;
        return next();
});

router.use(async function(ctx, next) {
    ctx.a = " ";
    await next();
});

router.get('/:id', (ctx, next) => {
    return next().then(() => {
        ctx.body += ctx.a + ctx.yolo;
   })
});

router.get('/:id', async function(ctx) {
    ctx.body = await Promise.resolve('hello');
});

mainRouter.mount('/pouet', router);

app.use(mainRouter.routes());

app.listen(1664);
// GET http://localhost:1664/pouet/world
// => hello world

Example with throw option

const Koa = require('koa');
const Router = require('koa-66');
const app = new Koa();

const router = new Router();

app.use(async function(ctx, next) {
	try {
		await next();
	}catch(e){
		if(e.status === 405) {
			ctx.status = 405;
			ctx.set(e.headers);
		}
	}
})

router.get('/', (ctx) => ctx.body = 'hello');

app.use(router.routes({throw: true}));

app.listen(1664);

// > curl http://localhost:1664/ -I -X POST
//
// HTTP/1.1 405 Method Not Allowed
// allow: HEAD, GET
// Content-Type: text/plain; charset=utf-8
// Content-Length: 18
// Date: Wed, 04 Nov 2015 10:29:06 GMT
// Connection: keep-alive

Plugin support

I don't know if Plugin is a good term for this feature. The goal was to add cappability to register some middleware on a main Router that will be inject via config object on different route. (ex: authentication or acl behaviour). Why? Because I am lazy to require some middleware in all my router script with generaly relatif path...

So I decided to add the possibility to inject an object at first parameter (that will be a config object) and adding an extra middleware that will be inject in middleware stack. To register this plugin just use a plugin()method.

I will probably pass options on ctx.state object on next version

const Router = require('koa-66');
const main = new Router();

// you can use multiple middleware as arguments or array
main.plugin('authent', (ctx, next, options) => {
	// do stuff inject user on context for example
	return next();
	//or throw or do nothing that will stop execution of router stack
})

main.plugin('acl', (ctx, next, options) => {
	// do stuff check role via options object for example
	return next();
	//or throw or do nothing that will stop execution of router stack
})

const router = new Router();

router.use({authent: true});
//options here is a boolean,
//but you can pass everything you want,
//and it will be inject as options

router.get('/private', {acl:['admin']}, 
	ctx => ctx.body = 'private'
)

main.mount('/api', router);
...	
// order of call /api/private
// 1 plugin authent
// 2 plugin acl
// 3 real middleware 

Test

# npm test

koa-66's People

Contributors

menems avatar fredericheem avatar alexanderneu avatar buunguyen avatar

Watchers

James Cloos avatar  avatar  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.