如何在 Nest.js 中使用查询参数?

我是 Nest.js 的新生。

我的代码如下

  @Get('findByFilter/:params')
async findByFilter(@Query() query): Promise<Article[]> {


}

我已经使用 postman来测试这个路由器

Http://localhost:3000/article/findbyfilter/bug?google=1&baidu=2

实际上,我可以得到查询结果 { google: '1', baidu: '2' }。但我不清楚为什么网址有一个字符串 'bug'

如果我删掉那个词,就像

Http://localhost:3000/article/findbyfilter?google=1&baidu=2

然后邮递员将显示 statusCode 404

实际上,我不需要字 bug,如何自定义路由器,以实现我的目的就像 http://localhost:3000/article/findByFilter?google=1&baidu=2

这里的另一个问题是如何使多路由器指向一个方法?

158931 次浏览

查询参数

你必须移除 :params,它才能正常工作:

@Get('findByFilter')
async findByFilter(@Query() query): Promise<Article[]> {
// ...
}

路径参数

:param语法用于路径参数并匹配路径上的任何字符串:

@Get('products/:id')
getProduct(@Param('id') id) {

符合路线

localhost:3000/products/1
localhost:3000/products/2abc
// ...

路由通配符

要将多个端点匹配到同一个方法,可以使用路由通配符:

@Get('other|te*st')

会匹配

localhost:3000/other
localhost:3000/test
localhost:3000/te123st
// ...

我们可以使用@Req ()

import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';


(...)


@Get(':framework')
getData(@Req() request: Request): Object {
return {...request.params, ...request.query};
}

/巢? 版本 = 7

{
"framework": "nest",
"version": "7"
}

继续读

您可以使用 @Req装饰器,并使用 param 对象,请参见:

@Get()
findAll(
@Req() req: Request
): Promise<any[]> {
console.log(req.query);
// another code ....
}

如果将参数设置为 part 或 url: 文章/${ artileId }/详细信息,则使用@Param

@Get('/articles/:ARTICLE_ID/details')
async getDetails(
@Param('ARTICLE_ID') articleId: string
)

如果要提供查询参数 Google = 1 & 百度 = 2,可以使用

@Get('/article/findByFilter/bug?')
async find(
@Query('google') google: number,
@Query('baidu') baidu: number,
)

为了更好地解释,我用 数字变换器数字变换器类编写了一个分页示例:

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'
}
}