Skip to content
On this page

Routing

Verb provides a fast, flexible routing system.

Basic Routes

typescript
import { server } from "verb"

const app = server.http()

app.get("/", handler)
app.post("/users", handler)
app.put("/users/:id", handler)
app.delete("/users/:id", handler)

Route Parameters

typescript
// Named parameters
app.get("/users/:id", (req, res) => {
  res.json({ id: req.params.id })
})

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

Wildcards

typescript
// Match anything after /files/
app.get("/files/*", (req, res) => {
  const path = req.params["*"]
  res.send(`Path: ${path}`)
})

// /files/images/photo.jpg → path = "images/photo.jpg"

Query Strings

typescript
// GET /search?q=hello&page=2
app.get("/search", (req, res) => {
  const { q, page } = req.query
  res.json({ query: q, page })
})

Route Groups

Organize routes with common prefixes:

typescript
// API routes
app.group("/api", (api) => {
  api.get("/users", listUsers)
  api.post("/users", createUser)
  api.get("/users/:id", getUser)
})

// Admin routes with middleware
app.group("/admin", [authMiddleware, adminMiddleware], (admin) => {
  admin.get("/dashboard", dashboard)
  admin.get("/users", manageUsers)
})

Router

Create modular routers:

typescript
import { createRouter } from "verb"

// users.ts
export const usersRouter = createRouter()
  .get("/", listUsers)
  .post("/", createUser)
  .get("/:id", getUser)
  .put("/:id", updateUser)
  .delete("/:id", deleteUser)

// app.ts
import { usersRouter } from "./users"

app.use("/api/users", usersRouter)

Method Chaining

typescript
app
  .get("/", home)
  .get("/about", about)
  .post("/contact", contact)
  .listen(3000)

404 Handling

typescript
// Catch-all for unmatched routes (must be last)
app.use((req, res) => {
  res.status(404).json({ error: "Not found" })
})

Route Matching Order

Routes are matched in definition order:

typescript
// More specific routes first
app.get("/users/me", getCurrentUser)    // Matches /users/me
app.get("/users/:id", getUserById)      // Matches /users/123

// Wildcards last
app.get("/files/*", serveFile)          // Matches /files/anything

Released under the MIT License.