Skip to main content

Router

Apex Router

The Router is the core component of Apex that handles HTTP routing, middleware management, and request processing.

Creating a Router

const router = new apex.Router();

Route Handling

Basic Routes

Define routes for different HTTP methods:

// GET request handler
router.get("/users", (req, res) => {
res.json({ users: ["Alice", "Bob", "Charlie"] });
});

// POST request handler
router.post("/users", (req, res) => {
// Create a new user
const newUser = req.body;
// Process the user data...
res.status(201).json({ message: "User created", user: newUser });
});

// PUT request handler
router.put("/users/:id", (req, res) => {
const userId = req.params.id;
// Update user with ID
res.json({ message: `User ${userId} updated`, data: req.body });
});

// DELETE request handler
router.delete("/users/:id", (req, res) => {
const userId = req.params.id;
// Delete user with ID
res.status(200).json({ message: `User ${userId} deleted` });
});

Route Parameters

Routes can contain dynamic segments (parameters) prefixed with a colon:

router.get("/products/:category/:id", (req, res) => {
const { category, id } = req.params;
res.json({
message: `Fetching product ${id} from category ${category}`,
category,
productId: id,
});
});

router.get("/posts/:postId/comments/:commentId", (req, res) => {
const postId = req.params.postId;
const commentId = req.params.commentId;
res.json({ postId, commentId });
});

router.get("/blog/:year/:month/:slug", (req, res) => {
const { year, month, slug } = req.params;

res.json({
article: {
title: `Article: ${slug}`,
publishedAt: `${month}/${year}`,
content: "This is the article content",
},
});
});

Middleware

Apply middleware to process requests before they reach route handlers.

Global Middleware

// Apply middleware to all routes
router.use((req, res, next) => {
console.log(`${req.method} ${req.path} - ${new Date().toISOString()}`);
next(); // Continue to the next middleware or route handler
});

// Apply body parser middleware
router.use(apex.bodyParser());

Path-Specific Middleware

Apply middleware to specific paths:

// Apply middleware only to routes starting with /api
router.use("/api", (req, res, next) => {
// Check for API key
const apiKey = req.query["x-api-key"];
if (!apiKey || apiKey !== "valid-key") {
return res.status(401).json({ error: "Invalid API key" });
}
next();
});

Server Configuration

Json Spaces

Configuring JSON Spaces for pretty print.

router.set("json spaces", 2); // 2 JSON spaces

Trust Proxy

Configure Trust Proxy to trust specific or all reverse proxies

router.set("trust proxy", true); // trust all proxies
router.set("trust proxy", "all"); // trust all proxies

router.set("trust proxy", 1); // trust only first proxy

Get Settings

Retrieve configured settings:

const trustProxy = router.getSetting("trust proxy");
console.log(`Current trust proxy: ${trustProxy}`);

Flash Messages

Enable and use flash messages:

// Enable flash middleware
router.use(router.useFlash());

// Using flash in a route
router.post("/login", (req, res) => {
const { username, password } = req.body;

if (username === "admin" && password === "password") {
req.flash("success", "Login successful");
res.redirect("/dashboard");
} else {
req.flash("error", "Invalid credentials");
res.redirect("/login");
}
});

// Accessing flash messages in a route
router.get("/dashboard", (req, res) => {
const successMessages = req.flash("success");
res.render("dashboard", { messages: successMessages });
});