koa-happy-router

koa-happy-router provides easy-to-use routing configuraion, smart and powerful middleware mechanism.

Usage no npm install needed!

<script type="module">
  import koaHappyRouter from 'https://cdn.skypack.dev/koa-happy-router';
</script>

README

koa-happy-router

koa-happy-router provides easy-to-use routing configuraion likes hapi, powerful and freedom middleware mechanism.

🆕 Features

  • Easy-to-use routing configuraion
  • Powerful and freedom middleware mechanism
  • Stronge error handler

📦 Install

If you use npm

npm install koa-happy-router

or yarn

yarn add koa-happy-router

🎮 Usage

Basic Usage

const Koa = require("koa");
const HappyRouter = require("koa-happy-router");

const app = new Koa();
const router = new HappyRouter();

router.addRoutes([
  {
    url: "/",
    handler: (ctx) => (ctx.body = "Hello World!"),
  },
]);

app.use(router.routes()).use(router.allowMethods());
app.listen(8080);

Middlewares Usage

You can register the global middleware by registerMiddlewares, which can be used in routing after registration, and it focus some common logic. Use sortMiddlewares to arrange the execution order of middleware, likes onion ring model of koa.

const Koa = require("koa");
const HappyRouter = require("koa-happy-router");
const { default: AsyncValidator } = require("async-validator");

const app = new Koa();
const router = new HappyRouter();

router.registerMiddlewares({
  validate: (config) => async (ctx, next) => {
    const source = { ...ctx.query };
    const schema = new AsyncValidator({ ...config });
    try {
      await schema.validate(source, { first: true });
      await next();
    } catch (error) {
      const { errors = [] } = error;
      ctx.body = { status: -2, ...errors[0] };
    }
  },
  needLogin: (needLogin) => async (ctx, next) => {
    if (needLogin && ctx.state.hasLogin) {
      await next();
    }
    ctx.body = { status: -1, message: "please login" };
  },
});
router.sortMiddlewares(["needLogin", "validate"]);

router.addRoutes([
  {
    url: "/",
    handler: (ctx) => (ctx.body = "Hello World!"),
  },
  {
    url: "/user",
    needLogin: true,
    validate: {
      id: {
        required: true,
      },
    },
    middlewares: [
      async (ctx, next) => {
        console.log("Find user data by id after needLogin and validate");
        await next();
      },
    ],
    handler: (ctx) => (ctx.body = "Hello World!"),
  },
]);

app.use(router.routes()).use(router.allowMethods());
app.listen(8080);

Typescript

koa-happy-router is written in Typescript, so you could use it in Typescript.

const Koa = require("koa");
const HappyRouter = require("koa-happy-router");

const app = new Koa();
const router = new HappyRouter();

interface addRoutesProps {
  needLogin: boolean;
}

router.registerMiddlewares({
  needLogin: (needLogin: boolean) => async (ctx, next) => {
    if (needLogin && ctx.state.hasLogin) {
      await next();
    }
    ctx.body = { status: -1, message: "please login" };
  },
});
router.addRoutes<addRoutesProps>([
  {
    url: "/",
    needLogin: true,
    handler: (ctx) => (ctx.body = "Hello World!"),
  },
]);

app.use(router.routes()).use(router.allowMethods());
app.listen(8080);