All Projects → tsndr → cloudflare-worker-router

tsndr / cloudflare-worker-router

Licence: MIT license
A super lightweight router (1.3K) with middleware support and ZERO dependencies for CloudFlare Workers.

Programming Languages

typescript
32286 projects

Projects that are alternatives of or similar to cloudflare-worker-router

workers-jwt
Generate JWTs on Cloudflare Workers using the WebCrypto API
Stars: ✭ 67 (-53.47%)
Mutual labels:  workers, cloudflare, cloudflare-workers
DNS-over-Discord
A 1.1.1.1 DNS resolver built for Discord
Stars: ✭ 228 (+58.33%)
Mutual labels:  cloudflare, cloudflare-worker, cloudflare-workers
natural
Fastest Framework for NodeJS. Written in pure ES6+
Stars: ✭ 30 (-79.17%)
Mutual labels:  workers, cloudflare, cloudflare-workers
IPFS PHOTO SHARE
💰用甚嚒服务器,ServerLess搭建一个图片分享站点!| 基于CloudFlareWorker无服务器函数和IPFS去中心化存储的图片分享网站
Stars: ✭ 76 (-47.22%)
Mutual labels:  cloudflare, cloudflare-worker, cloudflare-workers
cloudflare-worker-graphql-ws-template
A template for WebSockets powered Cloudflare Worker project using graphql-ws
Stars: ✭ 21 (-85.42%)
Mutual labels:  workers, cloudflare, cloudflare-workers
telegram-bot-api-worker
Take an alternate route to Telegram Bot API :)
Stars: ✭ 75 (-47.92%)
Mutual labels:  cloudflare, cloudflare-worker, cloudflare-workers
vite-plugin-cloudflare
🔥Building Cloudflare workers is faster and easier using vite-plugin-cloudflare with node builtins like process and stream
Stars: ✭ 108 (-25%)
Mutual labels:  workers, cloudflare
cloudflare-worker-rest-api
A cloudflare worker module which helps building REST Api quickly and easily, similar to express framework.
Stars: ✭ 31 (-78.47%)
Mutual labels:  workers, cloudflare
Create Google Shared Drive
Cloudflare Redesigned Script for creating a Shared/Team Drive
Stars: ✭ 93 (-35.42%)
Mutual labels:  workers, cloudflare
Vitedge
Edge-side rendering and fullstack Vite framework
Stars: ✭ 150 (+4.17%)
Mutual labels:  worker, cloudflare
html
HTML templating and streaming response library for Service Worker-like environments such as Cloudflare Workers.
Stars: ✭ 41 (-71.53%)
Mutual labels:  workers, cloudflare-workers
Serverless Cloudflare Workers
Serverless provider plugin for Cloudflare Workers
Stars: ✭ 114 (-20.83%)
Mutual labels:  workers, cloudflare
Cfworker
A collection of packages optimized for Cloudflare Workers and service workers.
Stars: ✭ 152 (+5.56%)
Mutual labels:  workers, cloudflare
Cloudflare Workers Webpack Plugin
Launch Cloudflare Workers to the Edge from the comfort of your build step 🚀
Stars: ✭ 18 (-87.5%)
Mutual labels:  worker, cloudflare
viteflare
Cloudflare workers meet Vite plugins
Stars: ✭ 35 (-75.69%)
Mutual labels:  workers, cloudflare
Worker Typescript Template
ʕ •́؈•̀) TypeScript template for Cloudflare Workers
Stars: ✭ 129 (-10.42%)
Mutual labels:  workers, cloudflare
celery.node
Celery task queue client/worker for nodejs
Stars: ✭ 164 (+13.89%)
Mutual labels:  worker, workers
Sidekiq Job Php
Push and schedule jobs to Sidekiq from PHP
Stars: ✭ 34 (-76.39%)
Mutual labels:  worker, workers
Simpleue
PHP queue worker and consumer - Ready for AWS SQS, Redis, Beanstalkd and others.
Stars: ✭ 124 (-13.89%)
Mutual labels:  worker, workers
faaskit
A lightweight middleware framework for functions as a service
Stars: ✭ 24 (-83.33%)
Mutual labels:  cloudflare, cloudflare-workers

Cloudflare Workers Router

Cloudflare Workers Router is a super lightweight router (1.3K gzipped) with middleware support and ZERO dependencies for Cloudflare Workers.

When I was trying out Cloudflare Workers I almost immediately noticed how fast it was compared to other serverless offerings. So I wanted to build a full-fledged API to see how it performs doing real work, but since I wasn't able to find a router that suited my needs I created my own.

I worked a lot with Express.js in the past and really enjoyed their middleware approach, but since none of the available Cloudflare Worker routers offered middleware support at the time, I felt the need to create this router.

Contents

Features

  • ZERO dependencies
  • Lightweight (1.3K gzipped)
  • Fully written in TypeScript
  • Integrated Debug-Mode & CORS helper
  • Built specifically around Middlewares

Usage

TypeScript Example

import { Router } from '@tsndr/cloudflare-worker-router'

export interface Env {
    // Example binding to KV. Learn more at https://developers.cloudflare.com/workers/runtime-apis/kv/
    // MY_KV_NAMESPACE: KVNamespace
    //
    // Example binding to Durable Object. Learn more at https://developers.cloudflare.com/workers/runtime-apis/durable-objects/
    // MY_DURABLE_OBJECT: DurableObjectNamespace
    //
    // Example binding to R2. Learn more at https://developers.cloudflare.com/workers/runtime-apis/r2/
    // MY_BUCKET: R2Bucket
}


// Initialize router
const router = new Router<Env>()

// Enabling build in CORS support
router.cors()

// Register global middleware
router.use(({ req, res, next }) => {
    res.headers.set('X-Global-Middlewares', 'true')
    next()
})

// Simple get
router.get('/user', ({ req, res }) => {
    res.body = {
        data: {
            id: 1,
            name: 'John Doe'
        }
    }
})

// Post route with url parameter
router.post('/user/:id', ({ req, res }) => {

    const userId = req.params.id

    // Do stuff...

    if (errorDoingStuff) {
        res.status = 400
        res.body = {
            error: 'User did stupid stuff!'
        }
        return
    }

    res.status = 204
})

// Delete route using a middleware
router.delete('/user/:id', ({ req, res, next }) => {

    if (!apiTokenIsCorrect) {
        res.status = 401
        return
    }

    await next()
}, (req, res) => {

    const userId = req.params.id

    // Do stuff...
})

// Listen Cloudflare Workers Fetch Event
export default {
    async fetch(request: Request, env: Env): Promise<Response> {
        return router.handle(env, request)
    }
}
JavaScript Example
import { Router } from '@tsndr/cloudflare-worker-router'

// Initialize router
const router = new Router()

// Enabling build in CORS support
router.cors()

// Register global middleware
router.use(({ req, res, next }) => {
    res.headers.set('X-Global-Middlewares', 'true')
    next()
})

// Simple get
router.get('/user', ({ req, res }) => {
    res.body = {
        data: {
            id: 1,
            name: 'John Doe'
        }
    }
})

// Post route with url parameter
router.post('/user/:id', ({ req, res }) => {

    const userId = req.params.id

    // Do stuff...

        if (errorDoingStuff) {
            res.status = 400
            res.body = {
                error: 'User did stupid stuff!'
            }
            return
        }

    res.status = 204
})

// Delete route using a middleware
router.delete('/user/:id', ({ req, res, next }) => {

    if (!apiTokenIsCorrect) {
        res.status = 401
        return
    }

    await next()
}, (req, res) => {

    const userId = req.params.id

    // Do stuff...
})

// Listen Cloudflare Workers Fetch Event
export default {
    async fetch(request, env) {
        return router.handle(env, request)
    }
}

Reference

router.debug([state = true])

Enable or disable debug mode. Which will return the error.stack in case of an exception instead of and empty 500 response. Debug mode is disabled by default.

state

State is a boolean which determines if debug mode should be enabled or not (default: true)

Key Type Default Value
state boolean true

router.use([...handlers])

Register a global middleware handler.

handler(ctx)

Handler is a function which will be called for every request.

ctx

Object containing env, req, res, next

router.cors([config])

If enabled will overwrite other OPTIONS requests.

config (object, optional)

Key Type Default Value
allowOrigin string *
allowMethods string *
allowHeaders string *
maxAge integer 86400
optionsSuccessStatus integer 204

Supported Methods

  • router.any(url, [...handlers])
  • router.connect(url, [...handlers])
  • router.delete(url, [...handlers])
  • router.get(url, [...handlers])
  • router.head(url, [...handlers])
  • router.options(url, [...handlers])
  • router.patch(url, [...handlers])
  • router.post(url, [...handlers])
  • router.put(url, [...handlers])
  • router.trace(url, [...handlers])

url (string)

The URL starting with a /. Supports the use of dynamic parameters, prefixed with a : (i.e. /user/:userId/edit) which will be available through the req-Object (i.e. req.params.userId).

handlers (function, optional)

An unlimited number of functions getting req and res passed into them.

ctx-Object

Key Type Description
env object Environment
req req-Object Request Object
res res-Object Response Object
next next-Handler Next Handler

req-Object

Key Type Description
body object / string Only available if method is POST, PUT, PATCH or DELETE. Contains either the received body string or a parsed object if valid JSON was sent.
headers Headers Request Headers Object
method string HTTP request method
params object Object containing all parameters defined in the url string
query object Object containing all query parameters

res-Object

Key Type Description
body object / string Either set an object (will be converted to JSON) or a string
headers Headers Response Headers Object
status integer Return status code (default: 204)
webSocket WebSocket Upgraded websocket connection

Setup

Please follow Cloudflare's Get started guide to install wrangler.

Initialize Project

wrangler init <name>

Use of TypeScript is strongly encouraged :)

npm i -D @tsndr/cloudflare-worker-router

TypeScript (src/index.ts)

import { Router } from '@tsndr/cloudflare-worker-router'

export interface Env {
  // Example binding to KV. Learn more at https://developers.cloudflare.com/workers/runtime-apis/kv/
  // MY_KV_NAMESPACE: KVNamespace
  //
  // Example binding to Durable Object. Learn more at https://developers.cloudflare.com/workers/runtime-apis/durable-objects/
  // MY_DURABLE_OBJECT: DurableObjectNamespace
  //
  // Example binding to R2. Learn more at https://developers.cloudflare.com/workers/runtime-apis/r2/
  // MY_BUCKET: R2Bucket
}

const router = new Router<Env>()

/// Example Route
//
// router.get('/hi', ({ res }) => {
//    res.body = 'Hello World'
// })


/// Example Route for splitting into multiple files
//
// const hiHandler: RouteHandler<Env> = ({ res }) => {
//     res.body = 'Hello World'
// }
//
// router.get('/hi', hiHandler)


// TODO: add your routes here

export default {
    async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
        return router.handle(env, request)
    }
}

JavaScript (src/index.js)

Consider using TypeScript instead :)
import { Router } from '@tsndr/cloudflare-worker-router'

const router = new Router()

// router.get(/'hi', ({ res }) => {
//    res.body = 'Hello World'
//}

// TODO: add your routes here

export default {
    async fetch(request, env, ctx) {
        return router.handle(env, request)
    }
}
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].