XyPriss Routing Guide #

XyPriss provides a flexible routing system with support for parameters, wildcards, and modular routers.

Basic Routes #

import { createServer } from "xypriss";

const app = createServer();

app.get("/", (req, res) => {
  res.xJson({ message: "Welcome to XyPriss" });
});

app.post("/users", (req, res) => {
  res.xJson({ message: "User created", data: req.body });
});

app.put("/users/:id", (req, res) => {
  res.xJson({ message: "User updated", id: req.params.id });
});

Route Parameters #

Extract dynamic segments from URLs:

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

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

Wildcard Routes #

  • Single Wildcard (*): Matches one path segment.
  • **Multi-segment Wildcard (**)**: Matches multiple path segments.
app.get("/files/*", (req, res) => {
  res.xJson({ filename: req.params["*"] }); // e.g., "document.pdf"
});

app.get("/api/**", (req, res) => {
  res.xJson({ path: req.params["**"] }); // e.g., "v1/users/123"
});

Modular Routers #

Organize routes with routers:

import { createServer, Router } from "xypriss";

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

userRouter.get("/", (req, res) => {
  res.xJson({ message: "List users" });
});

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

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

Middleware #

Apply middleware globally, per route, or per router:

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

// Route-specific middleware
app.get(
  "/protected",
  (req, res, next) => {
    if (!req.headers.authorization) {
      return res.status(401).json({ error: "Unauthorized" });
    }
    next();
  },
  (req, res) => {
    res.xJson({ message: "Protected resource" });
  },
);

Advanced Routing Patterns #

Route Groups #

const apiRouter = Router();

apiRouter.use("/v1", v1Router);
apiRouter.use("/v2", v2Router);

app.use("/api", apiRouter);

Conditional Routes #

app.get("/admin/*", authMiddleware, adminMiddleware, (req, res) => {
  res.xJson({ admin: true });
});

Error Handling in Routes #

app.get("/error-test", async (req, res) => {
  try {
    throw new Error("Test error");
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

Best Practices #

  1. Use routers for organizing related routes
  2. Apply middleware at the appropriate level (global, router, or route)
  3. Use route parameters for dynamic segments
  4. Validate inputs in middleware before reaching route handlers
  5. Handle errors consistently across all routes

← Back to Main Documentation