Skip to content

Routing

Create a new route

You can add a new item in the ROUTES object of src/app/routes.ts:

export const ROUTES = {
    "GET:/": {
        callback: async ({ response }: HttpContext) => {
            return response.setResponse({
                contentType: "text/html",
                body: await readFile("./src/templates/index.html", "utf8")
            })
        },
    },
}

As you can see, the key is the endpoint of the route (if a GET request on '/' is detected, the specified callback will be called).

The callback takes a HttpContext parameter, and must return a Response. These are needed to achieve the request path into our system, from the receiving to the response sending.

If we can, we can add middlewares and route description:

export const ROUTES = {
    "GET:/": {
        callback: async ({ response }: HttpContext) => {
            return response.setResponse({
                contentType: "text/html",
                body: await readFile("./src/templates/index.html", "utf8")
            })
        },
        middlewares: [ new MyMiddleware() ],
        description: 'This is the homepage',
    },
}

Routes with params

You can specify a parameter by writing :<param name> in the url, like in the examples below:

    "GET:/hello/:name": {
        callback: async ({ request, response }: HttpContext) => {
            return response.setResponse({
                contentType: "text/html",
                body: `Hello ${request.params.name}`
            })
        }
    },
    "GET:/hello/:name/:hi": {
        callback: async ({ request, response }: HttpContext) => {
            return response.setResponse({
                contentType: "text/html",
                body: `Hello ${request.params.name} ${request.params.hi}`
            })
        }
    },

If you want to access to those params in the controller, you can get them from request.params.<param>.

Bug

You cannot have two params between two /.

E.g: this /post/:slug-:id won't work. Instead do post/:slug/:id.

Controllers

You can create controllers to split the code in many files.

export class CoreController extends BaseController {
    public async home({ response }: HttpContext) {
        return response.setResponse({
            contentType: "text/html",
            body: await readFile("./src/templates/index.html", "utf8")
        })
    }
}

And then your route is like this:

"GET:/": {
    controller: ["CoreController", "home"],
    middlewares: [ new MyMiddleware() ],
    description: 'This is the homepage',
},

List routes

If you want to list all the existing routes, you can run the command node fcli list-routes.