ค้นหาเว็บไซต์

javascript - วิธีการใช้พารามิเตอร์ในการสอบถามใน 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

แล้วพนักงานส่งจดหมายจะแสดงรหัสสถานะ 404

จริง ๆ แล้ว ฉันไม่ต้องการคำว่า bug วิธีปรับแต่งเราเตอร์เพื่อให้บรรลุเป้าหมายของฉันเหมือนกับ http://localhost:3000/article/findByFilter?google=1&baidu=2

อีกคำถามหนึ่งคือวิธีทำให้หลายตัวกำหนดเส้นทางชี้ไปยังวิธีเดียวกันได้อย่างไร?

คำตอบ #1

พารามิเตอร์ของคำค้น

คุณต้องลบ :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
// ...

ไวลด์การ์ดของเส้นทาง

ในการจับคู่หลาย endpoints กับเมทอดเดียวกัน คุณสามารถใช้ route wildcards:

@Get('other|te*st')

จะเข้ากัน

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

คำตอบ #2

ถ้าคุณมีพารามิเตอร์เป็นส่วนหนึ่งของ URL: /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,
)

แก้ไข: ส่วนของเส้นทาง (/article/findByFilter/bug) ไม่ควรมีเครื่องหมายคำถามต่อท้ายแม้ว่าคุณจะคาดหวังพารามิเตอร์คำค้น เมื่อคุณระบุเครื่องหมายคำถาม (เช่น /article/findByFilter/bug?) จะทำให้ตัวอักษร g ตัวสุดท้ายกลายเป็นตัวเลือก เนื่องจากสตริงนี้ถูกจัดการเป็น regex

คำตอบ #3

เราสามารถใช้ @Req()

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

(...)

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

/รัง?version=7

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

อ่านเพิ่มเติม

บทความที่เกี่ยวข้อง