Node.JS : Как вы проверяете параметры запроса в контроллерах маршрутизации?

#node.js #rest #routing-controllers

#node.js #отдых #контроллеры маршрутизации

Вопрос:

допустим, у вас есть такой интерфейс:

 import { Get, QueryParam } from 'routing-controllers';
// ...
@Get('/students')
async getStudents(
    @QueryParam('count') count?: number,
): Promise<void> {
    console.log(count);
}
 

Как вы гарантируете, что count является int, а не float, например? Что-то вроде этого недопустимо:

 @IsInt() @QueryParam('count') count?: number,
 

IsInt можно использовать только для свойства класса, например, для модели тела, а не для одного значения параметра. Но согласно. это https://github.com/typestack/routing-controllers#auto-validating-action-params это возможно:

Этот метод работает не только с @Body, но и с @Param, @QueryParam, @BodyParam и другими декораторами.

Комментарии:

1. Число. isInteger (количество)

Ответ №1:

Я пропустил это в документах: https://github.com/typestack/routing-controllers#inject-query-parameters Вводя все параметры запроса вместо отдельных параметров запроса, вы можете проверить их как модель класса:

 enum Roles {
    Admin = "admin",
    User = "user",
    Guest = "guest",
}

class GetUsersQuery {

    @IsPositive()
    limit: number;

    @IsAlpha()
    city: string;

    @IsEnum(Roles)
    role: Roles;

    @IsBoolean()
    isActive: boolean;

}

@Get("/users")
getUsers(@QueryParams() query: GetUsersQuery) {
    // here you can access query.role, query.limit
    // and others valid query parameters
}
 

Кроме того, убедитесь, что вы не используете barrel-imports для импорта перечислений, иначе open-api-generator выдаст сообщение об ошибке, что перечисление не определено, а не объект and; например, избегайте этого: import { Roles } from '../..'