Skip to content

Instantly share code, notes, and snippets.

@NotFounds
Last active September 16, 2021 04:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NotFounds/41530c05c8f14d1c0840b176396aba6a to your computer and use it in GitHub Desktop.
Save NotFounds/41530c05c8f14d1c0840b176396aba6a to your computer and use it in GitHub Desktop.
URLPattern example in Deno
import { listenAndServe } from "https://deno.land/std@0.107.0/http/server.ts";
const addr = ":8080";
const patternsToHandlers = new Map([
[{ pathname: "/" }, rootHandler],
[{ pathname: "/ping" }, pingHandler],
[{ pathname: "/user/:id" }, userHandler],
]);
const routingMap = new Map();
for (const [pathPattern, handler] of patternsToHandlers) {
const compiledPattern = new URLPattern(pathPattern);
routingMap.set(compiledPattern, handler);
}
const routingHandler = (request: Request): Response => {
for (const [pattern, handler] of routingMap) {
const matched = pattern.exec(request.url);
if (matched) {
return handler(request, matched);
}
}
return new Response(null, { status: 404 });
};
console.log(`HTTP webserver running. Access it at: http://localhost${addr}/`);
await listenAndServe(addr, routingHandler);
// request handlers
function rootHandler(req: Request, matchRes: URLPatternResult | null) {
return new Response("Hello, World!", { status: 200 });
}
function pingHandler(req: Request, matchRes: URLPatternResult | null) {
return new Response("pong", { status: 200 });
}
function userHandler(req: Request, matchRes: URLPatternResult | null) {
return new Response(`User ID: ${matchRes?.pathname.groups.id}`, { status: 200 });
}
@NotFounds
Copy link
Author

@NotFounds
Copy link
Author

handler に URLPatternResult が露出してるのあまりイケてない気がするな

@NotFounds
Copy link
Author

URLPattern はあくまで URL の handle しか出来ないので http method と組み合わせて routing する場合は別で分岐が必要

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment