簡體   English   中英

如何在 Nest.js 中使用查詢參數?

[英]How to use query parameters in 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' } 但我不清楚為什么 url 有一個字符串'bug'

如果我刪除那個詞就像

http://localhost:3000/article/findByFilter?google=1&baidu=2

然后 postman 將顯示 statusCode 404

其實我不需要bug這個詞,如何自定義路由器來實現我的目的地,就像http://localhost:3000/article/findByFilter?google=1&baidu=2

這里的另一個問題是如何使多個路由器指向一個方法?

查詢參數

您必須刪除: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()

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

/nest?version=7

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

閱讀更多

如果您將參數作為部分或網址: /articles/${articleId}/details ,您將使用 @Param

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

如果您想提供查詢參數/article/findByFilter/bug? google=1&baidu=2 ,你可以使用

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

您可以使用@Req裝飾器,並使用 param 對象,請參閱:

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

為了更好地解釋,我用數字轉換器 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'
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM