FileSystemRouter API
Defining a fileSystemRouter()
keiro exports 2 fileSystemRouter functions both takes the same arguments: keiro/node and keiro/web:
keiro/node:fileSystemRouterreturns anodespecific middleware in the form:
type NodeRequestHandler = ( req: http.IncomingMessage, res: http.ServerResponse, next?: (err?: any) => void,) => MaybePromise<void>;keiro/web:fileSystemRouterreturns awebmiddleware in the form:
type WebRequestHandler = (request: Request) => MaybePromise<Response>;fileSystemRouter API reference
The fileSystemRouter function takes these optional arguments:
-
origin: Origin used for the request, by default uses theprocess.env.ORIGIN, on the web version is not needed because theoriginis determined from the request. -
cwd: The absolute path of the working directory, defaults toprocess.cwd() -
routesDir: The path the routes are located, relatived to thecwd, defaults tosrc/routes/. -
middleware: The name of the middleware, defaults tomiddleware. -
notFound: The name of the file used for 404 handling, defaults to404. -
prefix: A prefix used for all the routes. -
routeMapper: A class that maps a file-system path to a route, the default uses aNextJSlike routing. -
extensions: Extensions of valid routes, defaults to["js", "jsx", "cjs", "mjs", "ts", "tsx", "cts", "mts"]. -
ignorePrefix: A prefix used for ignore files or directories, defaults to_. -
ignoreFiles: A glob of files to ignore. -
getLocals: A function to initialize the request locals, this run even before the middleware. -
workers: Controls the worker threads, be default this is not enabled.
The RequestEvent
Any handler takes a RequestEvent which contains the request information,
this event contains the following properties:
RequestEventrequest: This is the standard Request object.params: AnRecord<string, string>object containing the params of a dynamic route.url: The parsed url of the request, this is the standard URL object which contains methods for reading thesearchParamsandpathname.cookies: An object to set, get and delete cookies.locals: This is an object containing values that can be access by any handling during the current request, the values in the locals is tie to the current request.
Reading Params
The name of the param matches the name of the filesystem file.
/posts/[post_id].ts: Have the parampost_id
import { defineHandler } fromn "keiro";import { db } from "@/lib/database";
export default defineHandler(async (event) => { const postId = event.params.post_id;
// `post_id` can be undefined if (!postId) { return new Response(null, { status: 400 }); }
const post = await db.posts.get(postId);
if (!post) { return new Response(null, { status: 404 }); }
return Response.json(post);})Using Cookies
Cookies provide the methods like Cookies.get, Cookies.set, Cookies.delete
import { defineHandler } fromn "keiro";import { db } from "@/lib/database";
export const POST = defineHandler(async (event) => { const sessionCookie = event.cookies.get("auth_session");
if (!sessionCookie) { return new Response(null, { status: 401 }); }
const session = await db.session.get(sessionCookie); return Response.json(session.user);})import { defineHandler } fromn "keiro";import { db } from "@/lib/database";
export const POST = defineHandler(async (event) => { const sessionCookie = event.cookies.get("auth_session");
if (!sessionCookie) { return new Response(null, { status: 401 }); }
event.cookies.delete("auth_session"); return new Response(null)})Using request Locals
By default locals have the type Record<string, unknown>, to type the locals global you need to augment the Register type.
export declare module "keiro/types" { export interface Register { Locals: { session: { userId: number; username: string; } }; }}After that the event.locals will be typed as:
interface Locals { session: { userId: number; username: string; }}And can be set or get in the requests handlers
import { declareMiddleware } from "keiro";import { getSession } from "@/lib/auth";
export default declareMiddleware((event, next) => { // We assign the session const session = await getSession(event.cookies);
// locals.session will never be null if (!session) { return new Response(null, { status: 401 }); }
event.locals.session = session; return next(event);});import { defineHandler } from "keiro";import { db } from "@/lib/database";
export default defineHandler(async (event) => { const user = await db.get(event.locals.session.userId); return Response.json(user);})Initialiting locals with getLocals
fileSystemRouter takes a getLocals functions that is called event
before middlewares, this function is intended to be used for set values
that are not suppose to be optional.
The getLocals function receives the RequestEvent object as well.
export declare module "keiro/types" { export interface Register { Locals: { time: Date; }; }}import { fileSystemRouter } from "keiro/node";import http from "node:http";
const port = 5000;http.createServer(fileSystemRouter({ origin: `http://localhost:${port}`, async getLocals() { return { time: new Date() } }})).listen(port);