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 ดูเหมือนจะเป็นตัวเลือกที่ดีที่สุด แม้ว่ามันจะไม่รู้สึกว่าถูกต้องสมบูรณ์แบบ
เนื่องจากคนอื่นดูเหมือนจะมีปัญหาเหมือนกัน การขอเพิ่มฟีเจอร์อาจเป็นความคิดที่ดี :-)
