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

typescript - วิธีที่ดีที่สุดในการจัดการการตอบกลับ 204 No Content ใน NestJS คืออะไร?


ฉันกำลังเขียน RESTful API ใน Nest ซึ่งฉันเพิ่งเริ่มใช้และชอบมันจนถึงตอนนี้ อย่างไรก็ตาม ฉันกำลังประสบปัญหาในการหาลวดลายที่สะอาดเพื่อจัดการกับการตอบสนอง 204 No Content สำหรับเส้นทาง GET ของฉัน มีคำแนะนำอะไรไหม?

ฉันค่อนข้างประหลาดใจที่ไม่มีสิ่งที่ถูกสร้างขึ้นในเฟรมเวิร์กเพื่อส่งคืน 204 หากวัตถุที่ถูกส่งกลับโดยเมธอดคอนโทรลเลอร์ GET ว่างเปล่า -- ถ้ามี ฉันก็ยังหาไม่เจอ หากจริง ๆ แล้วไม่มี ฉันก็สงสัยว่าเรื่องนี้คุ้มค่าที่จะเป็นฟีเจอร์รีเควสต์บน GitHub หรือไม่

ฉันได้ลองทำสิ่งต่อไปนี้:

  • การเปิดเผยคุณสมบัติ res ของ Express โดยใช้ @Response() เป็นพารามิเตอร์ของเมธอด Controller จากนั้นใช้ res.sendStatus(204) หากการตอบสนองว่างเปล่า อย่างไรก็ตาม สิ่งนี้ทำให้ฉันต้องส่งการตอบสนอง 200 ด้วยตนเองเช่นกัน ในขณะที่ฉันต้องการพึ่งพาเฟรมเวิร์กในการจัดการวงจรคำขอ-คำตอบและทำให้เมธอดของ Controller ของฉันสะอาดที่สุดเท่าที่จะทำได้
  • พิจารณาใช้ตัวดักจับ (interceptor) เพื่อตรวจสอบว่าตัวตอบสนอง (response object) ว่างหรือไม่ แล้วเขียนรหัสสถานะ 204 ลงในการตอบสนองที่นั่น ฉันไม่ค่อยอยากทำแบบนี้เพราะรหัสสถานะอาจเปลี่ยนแปลงได้ในภายหลังเนื่องจากตัวกรองข้อยกเว้น
  • การใช้มิดเดิลแวร์ในการเขียนโค้ดตอบสนอง แต่มิดเดิลแวร์ของฉันทำงานก่อนที่จะถูกส่งไปยังคอนโทรลเลอร์และฉันต้องตรวจสอบว่าการตอบสนองว่างหรือไม่หลังจากนั้น res.on('send') ดูเหมือนไม่สามารถดักการตอบสนองขณะที่ส่งออกได้เช่นกัน
  • การโยน NoContentException แบบกำหนดเองสำหรับตัวกรองข้อยกเว้นของฉันจัดการ แม้ว่าจะดูแปลกที่โยนข้อยกเว้นสำหรับรหัสตอบสนองที่ประสบความสำเร็จ แต่ฉันคิดว่านี่คือวิธีที่ฉันจะดำเนินการไปก่อนในขณะนี้เนื่องจากตัวกรองข้อยกเว้นของฉันเป็นสิ่งสุดท้ายที่จะทำงานในโค้ดที่ฉันเขียน

คำตอบ #1

ดูตัวอย่างนี้:

@Post()
@HttpCode(204)
create() {
  return 'This action adds a new cat';
}

นี่คือทั้งหมดที่คุณต้องทำ มันจะส่งกลับ 204 ให้คุณ

คำตอบ #2

อัปเดต v6.1.0

ตั้งแต่เวอร์ชัน v6.1.0 เป็นต้นไป สามารถตั้งรหัสตอบสนองใน Interceptor ได้ ดู PR นี้

คำตอบล้าสมัย

น่าเสียดายที่ดูเหมือนว่านี่ยังไม่สามารถทำได้ ในเอกสารระบุว่า:

บ่อยครั้ง รหัสสถานะของคุณไม่ได้คงที่แต่ขึ้นอยู่กับปัจจัยต่าง ๆ ในกรณีนั้น คุณสามารถใช้วัตถุตอบสนองเฉพาะไลบรารี (ฉีดโดยใช้ @Res()) (หรือในกรณีเกิดข้อผิดพลาด ให้โยนข้อยกเว้น)

คุณก็ไม่สามารถตั้งรหัสการตอบสนองใน Interceptor โดยไม่ส่งมัน (แทนที่จะใช้ sendStatus) เพราะตามที่ Kamil กล่าวในกระทู้นี้:

ตรรกะของตัวควบคุมการตอบสนองระดับโลกเป็นขั้นตอนสุดท้ายที่ทำก่อนส่งผลลัพธ์สุดท้ายผ่านเครือข่าย (นั่นคือจุดที่รหัสสถานะเริ่มต้นถูกนำมาใช้)

ดังนั้นถ้าคุณ (ซึ่งเข้าใจได้) ไม่ต้องการใช้ @Res ในทุกคอนโทรลเลอร์ ExceptionFilter ดูเหมือนจะเป็นตัวเลือกที่ดีที่สุด แม้ว่ามันจะไม่รู้สึกว่าถูกต้องสมบูรณ์แบบ

เนื่องจากคนอื่นดูเหมือนจะมีปัญหาเหมือนกัน การขอเพิ่มฟีเจอร์อาจเป็นความคิดที่ดี :-)

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