Routing System

XyPriss provides a flexible routing system with Express-like API but without Express dependency.

Basic Routing

XyPriss supports all standard HTTP methods:

import { createServer } from "xypriss";

const app = createServer();

// Basic HTTP methods
app.get("/", (req, res) => {
    res.json({ message: "GET request" });
});

app.post("/users", (req, res) => {
    res.json({ message: "POST request", data: req.body });
});

app.put("/users/:id", (req, res) => {
    res.json({ message: "PUT request", id: req.params.id });
});

app.delete("/users/:id", (req, res) => {
    res.json({ message: "DELETE request", id: req.params.id });
});

Route Parameters

Single Parameters

// Single parameter
app.get("/users/:id", (req, res) => {
    const userId = req.params.id;
    res.json({ userId });
});

// Parameter with validation
app.get("/posts/:postId", (req, res) => {
    const { postId } = req.params;
    
    if (!postId || isNaN(Number(postId))) {
        return res.status(400).json({ error: "Invalid post ID" });
    }
    
    res.json({ postId: Number(postId) });
});

Multiple Parameters

// Multiple parameters
app.get("/users/:userId/posts/:postId", (req, res) => {
    const { userId, postId } = req.params;
    res.json({ userId, postId });
});

Wildcard Routes

Single Wildcard (*)

Matches exactly one path segment:

// Matches: /files/document.pdf, /files/image.jpg
// Does NOT match: /files/folder/document.pdf
app.get("/files/*", (req, res) => {
    const filename = req.params["*"];
    res.json({ filename });
});

Double Wildcard (**)

Matches multiple path segments:

// Matches: /api/v1/users, /api/v1/users/123/posts
app.get("/api/**", (req, res) => {
    const path = req.params["**"];
    res.json({ capturedPath: path });
});

Router System

Create modular, reusable route groups:

import { createServer, Router } from "xypriss";

const app = createServer();
const userRouter = Router();

// Add routes to router
userRouter.get("/", (req, res) => {
    res.json({ message: "Get all users" });
});

userRouter.get("/:id", (req, res) => {
    res.json({ message: "Get user", id: req.params.id });
});

userRouter.post("/", (req, res) => {
    res.json({ message: "Create user", data: req.body });
});

// Mount router at /api/users
app.use("/api/users", userRouter);

Middleware

Global Middleware

// Global middleware - applies to all routes
app.use((req, res, next) => {
    console.log(`${req.method} ${req.path}`);
    next();
});

Route-Specific Middleware

// Authentication middleware
const authenticate = (req, res, next) => {
    const token = req.headers.authorization;
    
    if (!token) {
        return res.status(401).json({ error: "No token provided" });
    }
    
    // Validate token
    req.user = { id: 1, name: "John Doe" };
    next();
};

// Protected route with middleware
app.get("/protected", authenticate, (req, res) => {
    res.json({ message: "Protected resource", user: req.user });
});