1.0.6 • Published 3 years ago

flarouter v1.0.6

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

Flarouter

npm version License download-url

Router middleware for cloudflare workers.

make sure wrangler is installed and type webpack.

Features

  • Simple.
  • Middleware support.
  • Area Router support.
  • Includes body parser (jsonBody, urlencodedBody, rawBody, multipartBody).
  • Return directly on handlers.

Install

npm i flarouter

Usage

import { createRouter } from "flarouter";

const handleEvent = createRouter({
  "GET/foo": (evt, next) => {
    return "bar";
  },
  "GET/foo/:name": (evt, next) => {
    const { name } = evt.params;
    return { my_name: name };
  },
  "GET/res": (evt, next) => {
    return new Response("res");
  }
});

addEventListener("fetch", (evt) => {
  evt.respondWith(handleEvent(evt));
});

Run Dev

wrangler dev

Publish

wrangler publish

Go to http://127.0.0.1:8787/foo

Middleware

...

// cors example
const cors = (evt, next) => {
  const { response } = evt;
  response.headers.set("Access-Control-Allow-Origin", "*");
  response.headers.set("Access-Control-Allow-Headers", "*");
  response.headers.set("Access-Control-Allow-Methods", "*");
  return next();
}
const foobar = (evt, next) => {
  // evt.locals help for declare middleware variable.
  evt.locals.foo = "bar";
  return next();
}
const options = {
  wares: [cors, foobar]
}
const handleEvent = createRouter(options, {
  "GET/hello": (evt) => {
    return evt.locals;
    // => { foo: "bar" }
  }
});
...

Multi Handler (middleware in handler)

...
const handleEvent = createRouter({
  "GET/foo": [
    // example auth
    (evt, next) => {
      const token = evt.request.headers.get("x-api-key") || "";
      if (token === "123") return next();
      throw new Error("Token not provided");
    },
    (evt, next) => {
      return "Success";
    },
  ]
});
...

Params

...
const handleEvent = createRouter({
  "GET/hello/:name": (evt, next) => {
    const { name } = evt.params;
    return "hello " + name;
  },
  // exact all
  "GET/*": (evt, next) => {
    const { wild } = evt.params;
    return wild;
  }
});
...

Query

Example: http://127.0.0.1:8787/hello?name=john

...
const handleEvent = createRouter({
  "GET/hello": (evt, next) => {
    const { name } = evt.query;
    if (!name) throw new Error("query name is required !");
    return "hello " + name;
  }
});
...

Body

support (json, urlencoded, multipart, text);

...
const handleEvent = createRouter({
  "POST/hello": (evt, next) => {
    const { name } = evt.body;
    if (!name) throw new Error("field name is required !");
    evt.response.status = 201;
    return "Created " + name;
  }
});
...

Multi Router

...
// item router
const itemRouter = {
  "GET/item": _ => "item",
  "GET/item/:id": ({ params }) => "item " + params.id,
}
// brand router
const brandRouter = {
  "GET/brand": _ => "brand",
  "GET/brand/:id": ({ params }) => "brand " + params.id,
}
const handleEvent = createRouter(itemRouter, brandRouter);
...

Area Router

import { createRouter, area } from "flarouter";

// Api Area
const itemRouter = { "GET/item": _ => "item" };
const brandRouter = { "GET/brand": _ => "brand" };
const apiArea = area({
  prefix: "/api/v1",
  router: [itemRouter, brandRouter],
  // wares: [foo, bar]
});

// Frontend Area
const homeRouter = { "GET/home": _ => "home" };
const aboutRouter = { "GET/about": _ => "about" };
const frontendArea = area({
  prefix: "/",
  router: [homeRouter, aboutRouter],
  // wares: [foo, bar]
});

// handle event
const handleEvent = createRouter(apiArea, frontendArea);
...

Response

...
// response status default 200
evt.response.status;

// response headers default new Headers()
evt.response.headers;
...

Handle Error

...
const options = {
  // handle error
  onError: (err) => ({ status: err.status, message: err.message }),
  // handle 404
  on404: (evt) => ({ status: 404, message: "not found" })
}

const handleEvent = createRouter(options, ...moreRouter);
...

List

  • Router
  • Middleware
  • Area
  • Body Parser
  • Unit Test

License

MIT