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 });
});