UNPKG

next-connect

Version:

The method routing and middleware layer for Next.js (and many others)

81 lines (80 loc) 2.58 kB
import { Router } from "./router.js"; export class NodeRouter { constructor() { this.router = new Router(); this.all = this.add.bind(this, ""); this.get = this.add.bind(this, "GET"); this.head = this.add.bind(this, "HEAD"); this.post = this.add.bind(this, "POST"); this.put = this.add.bind(this, "PUT"); this.patch = this.add.bind(this, "PATCH"); this.delete = this.add.bind(this, "DELETE"); } add(method, route, ...fns) { this.router.add(method, route, ...fns); return this; } use(base, ...fns) { if (typeof base === "function" || base instanceof NodeRouter) { fns.unshift(base); base = "/"; } this.router.use(base, ...fns.map((fn) => (fn instanceof NodeRouter ? fn.router : fn))); return this; } prepareRequest(req, res, findResult) { req.params = { ...findResult.params, ...req.params, // original params will take precedence }; } clone() { const r = new NodeRouter(); r.router = this.router.clone(); return r; } async run(req, res) { const result = this.router.find(req.method, getPathname(req.url)); if (!result.fns.length) return; this.prepareRequest(req, res, result); return Router.exec(result.fns, req, res); } handler(options = {}) { const onNoMatch = options.onNoMatch || onnomatch; const onError = options.onError || onerror; return async (req, res) => { const result = this.router.find(req.method, getPathname(req.url)); this.prepareRequest(req, res, result); try { if (result.fns.length === 0 || result.middleOnly) { await onNoMatch(req, res); } else { await Router.exec(result.fns, req, res); } } catch (err) { await onError(err, req, res); } }; } } function onnomatch(req, res) { res.statusCode = 404; res.end(req.method !== "HEAD" ? `Route ${req.method} ${req.url} not found` : undefined); } function onerror(err, req, res) { res.statusCode = 500; console.error(err); res.end("Internal Server Error"); } export function getPathname(url) { const queryIdx = url.indexOf("?"); return queryIdx !== -1 ? url.substring(0, queryIdx) : url; } export function createRouter() { return new NodeRouter(); }