typestack / routing-controllers

Create structured, declarative and beautifully organized class-based controllers with heavy decorators usage in Express / Koa using TypeScript and Routing Controllers Framework.
MIT License
4.4k stars 391 forks source link

feature: Dynamic route #1371

Closed pquerner closed 5 months ago

pquerner commented 5 months ago

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.

attilaorosz commented 5 months ago

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

What is your usecase?

pquerner commented 5 months ago

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..)

attilaorosz commented 5 months ago

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.

pquerner commented 5 months ago

Makes sense. Thanks for the hint! :)

github-actions[bot] commented 4 months ago

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.