I am a freshman in Nest.js.
And my code as below
@Get('findByFilter/:params')
async findByFilter(@Query() query): Promise<Article[]> {
}
I have used postman
to test this router
http://localhost:3000/article/findByFilter/bug?google=1&baidu=2
Actually, I can get the query result { google: '1', baidu: '2' }
. But I'm not clear why the url has a string 'bug'
?
If I delete that word just like
http://localhost:3000/article/findByFilter?google=1&baidu=2
then the postman will shows statusCode 404
.
Actually, I don't need the word bug
, how to custom the router to realize my destination just like http://localhost:3000/article/findByFilter?google=1&baidu=2
Here's another question is how to make mutiple router point to one method?
You have to remove :params
for it to work as expected:
@Get('findByFilter')
async findByFilter(@Query() query): Promise<Article[]> {
// ...
}
The :param
syntax is for path parameters and matches any string on a path:
@Get('products/:id')
getProduct(@Param('id') id) {
matches the routes
localhost:3000/products/1
localhost:3000/products/2abc
// ...
To match multiple endpoints to the same method you can use route wildcards:
@Get('other|te*st')
will match
localhost:3000/other
localhost:3000/test
localhost:3000/te123st
// ...
we can use @Req()
@Get(':framework')
getData(@Req() request: Request): Object {
return {...request.params, ...request.query};
}
/nest?version=7
{
"framework": "nest",
"version": "7"
}
If you have you parameter as part or url: /articles/${articleId}/details , you wold use @Param
@Get('/articles/:ARTICLE_ID/details')
async getDetails(
@Param('ARTICLE_ID') articleId: string
)
IF you want to provide query params /article/findByFilter/bug? google=1&baidu=2 , you could use
@Get('/article/findByFilter/bug?')
async find(
@Query('google') google: number,
@Query('baidu') baidu: number,
)
You can use the @Req
decorator, and use param object, see :
@Get()
findAll(
@Req() req: Request
): Promise<any[]> {
console.log(req.query);
// another code ....
}
For better explaining I wrote a pagination example with number transformer class:
class QueryDto {
@Type(() => Number)
@IsInt()
public readonly page: number;
@Type(() => Number)
@IsInt()
public readonly take: number;
}
@Injectable()
class QueryTransformPipe implements PipeTransform {
async transform(value: QueryRequestDto, { metatype }: ArgumentMetadata) {
if (!metatype) {
return value;
}
return plainToInstance(metatype, value);
}
}
@Controller()
class YourController {
@Get()
// also you can use it with pipe decorator
// @UsePipes(new QueryTransformPipe())
public async getData(@Query(new QueryTransformPipe()) query?: QueryRequestDto): Promise<any[]> {
// here you get instanceof QueryTransformPipe
// and typeof query.page === 'number' && typeof query.take === 'number'
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.