typestack/routing-controllers

feature: Dynamic route

pquerner opened this issue · 5 comments

Description

I would like to have dynamic route parameters.

This works:

import {Get, JsonController, Req, Res} from "routing-controllers";
import {Request, Response} from "express";
import {Service} from "typedi";

@JsonController('/api')
@Service()
export class TestController {

    static testRouteParam() {
        return 'asd';
    }

    @Get('/test/' + TestController.testRouteParam())
    test(@Res() response: Response, @Req() request: Request) {
        return [
            1,
            2,
            3
        ];
    }
}

route: /api/test/asd

while this does not:

import {Get, JsonController, Req, Res} from "routing-controllers";
import {Request, Response} from "express";
import {Service} from "typedi";
import {Users} from "../services/users";

@JsonController('/api')
@Service()
export class TestController {

    static async testRouteParam() {
        return await Users.getToken(123123);
    }

    @Get('/test/' + TestController.testRouteParam())
    test(@Res() response: Response, @Req() request: Request) {
        return [
            1,
            2,
            3
        ];
    }
}

route: /api/test/foo

No failures are given, its just a 404.

Decorators are not async, they will not wait for your async function execution.

What is your usecase?

I have a route like this currently:

/list/:customer(foo|bar)/. In the future baz could be added to the list. So I thought I could craft the regex in runtime. The values can come from a database.

I could simply accept anything in :customer and only do the filtering in the action part. I fear it would be too much, and thought when the routes are built it could be done just once. (Otherwise I would have to come up with caching, or a singleton etc..)

I would create a startup script where you fetch those values and store them in a global space before importing the controller. That way you can construct the regex before the decorator is executed and just reference it globally.

Keep in mind that decorators are only executed once, so if the query result might change at runtime you would out of luck anyway even with async decorators.

Makes sense. Thanks for the hint! :)

This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.