Router

In order to better structure the app ambiorix comes with the ability to create routers. These allow having a base path prepended to every route subsequently added to it; thereby enabling to physically and mentally better structure the routing logic of an application.

Consider the application below which does not make use of a router.

library(ambiorix)

# core app
app <- Ambiorix$new()

# homepage
app$get("/", \(req, res){
  res$send("Home!")
})

# /users logic
app$get("/users", \(req, res){
  res$send("List of users")
})

app$get("/users/:id", \(req, res){
  cat("Return user id:", req$params$id, "\n")
  res$send(req$params$id)
})

app$get("/users/:id/profile", \(req, res){
  msg <- sprintf("This is the profile of user #%s", req$params$id)
  res$send(msg)
})

app$start()

Ideally the /users logic should be separated from the main app, below we use the router in a router.R file where we place the /users logic. A base path is passed to the router instantiation; this will make it such that every subsequent route attached to the router will be prepended by this base path.

# router.R
# create router
router <- Router$new("/users")

router$get("/", \(req, res){
  res$send("List of users")
})

router$get("/:id", \(req, res){
  cat("Return user id:", req$params$id, "\n")
  res$send(req$params$id)
})

router$get("/:id/profile", \(req, res){
  msg <- sprintf("This is the profile of user #%s", req$params$id)
  res$send(msg)
})

We can then simplify app.R: it needs to source the router from router.R, the router then needs to be mounted on the core application with the use method.

library(ambiorix)

# core app
app <- Ambiorix$new()

app$get("/", \(req, res){
  res$send("Home!")
})

# mount the router
app$use(router)

app$start()