7 คะแนน โดย GN⁺ 2024-10-20 | 4 ความคิดเห็น | แชร์ทาง WhatsApp
  • PR แรกของ v5 ถูกเปิดไว้ตั้งแต่ 10 ปีก่อน และในที่สุดก็ถูก merge และ publish แล้ว
  • เป็นรีลีสที่ถูกทำให้เรียบง่ายโดยตั้งใจ เพื่อเปิดทางให้มีการเปลี่ยนแปลงที่ทรงอิทธิพลยิ่งขึ้นในรีลีสถัดไป
  • อีกทั้งยังเป็นการส่งสัญญาณให้ ecosystem ของ Node.js รู้ว่า Express กลับมาเดินหน้าอีกครั้ง

การเปลี่ยนแปลงสำคัญ

  • การเปลี่ยนแปลงการรองรับเวอร์ชันของ Node.js

    • ยุติการรองรับ Node.js 0.10 และเปลี่ยนเป็นรองรับ Node 18 ขึ้นไป
    • แก้ปัญหาที่การรองรับ Node.js เวอร์ชันเก่าทำให้การเปลี่ยนแปลงสำคัญด้านประสิทธิภาพและการบำรุงรักษาต้องล่าช้า
    • ทำให้สามารถนำความสามารถใหม่ของภาษาและรันไทม์มาใช้ และถอด dependency ที่ไม่จำเป็นออกได้
    • รับรู้ถึงความยากลำบากขององค์กรที่ยังใช้ Node.js เวอร์ชันเก่า และจะร่วมมือกับ HeroDevs เพื่อมอบ "การสนับสนุนแบบไม่มีกำหนด" ที่ยังคงให้ security patch สำคัญต่อไปหลัง v4 สิ้นสุดการสนับสนุน
  • การเปลี่ยนแปลงด้านการจับคู่เส้นทางและ regex

    • ไลบรารี path-to-regexp ถูกอัปเดตจาก 0.x เป็น 8.x ทำให้รวมการเปลี่ยนแปลงที่สะสมมาหลายปี
    • ยกเลิกการรองรับ regex subexpression (เช่น /:foo(\\d+))
      • ถูกถอดออกเพื่อป้องกันการโจมตีแบบ ReDoS
      • วิธีการย้าย: แนะนำให้ใช้ไลบรารีตรวจสอบความถูกต้องของอินพุตที่แข็งแรง
    • มี pattern แบบย่อสำหรับรูปแบบเส้นทางที่ใช้บ่อย
      • :name? เปลี่ยนเป็น {:name}
      • * เปลี่ยนเป็น *name
      • เพิ่ม (, ), [, ], ?, +, ! เป็นอักขระสงวน
    • ยกเลิกการรองรับ numeric parameter แบบมีลำดับ ต้องตั้งชื่อให้ทุก parameter
  • การรองรับ Promise

    • เพิ่มการรองรับ Promise ที่ถูก reject เพราะ error ที่เกิดขึ้นใน middleware
    • ไม่ครอบคลุมกรณีการเรียก next จาก Promise ที่ resolve แล้ว
    • ในกรณีส่วนใหญ่ ตอนนี้สามารถเขียน middleware ได้แบบนี้:
      app.use(async (req, res, next) => {  
        req.locals.user = await getUser(req);  
        next();  
      });  
      
  • การเปลี่ยนแปลงของ body parser

    • เพิ่มตัวเลือกสำหรับปรับความลึกของ urlencoded body เพื่อบรรเทา CVE-2024-45590 (ค่าเริ่มต้น 32)
    • ถอด bodyParser() middleware แบบรวมที่เลิกใช้แล้วออก
    • req.body จะไม่ถูกเริ่มต้นเป็น {} เสมอไปอีกต่อไป
    • ค่าเริ่มต้นของ extended ใน parser แบบ urlencoded เปลี่ยนเป็น false
    • เพิ่มการรองรับการบีบอัดข้อมูลแบบไม่สูญเสียด้วย Brotli
  • ถอด method signature ที่เลิกใช้ออก

    • res.redirect('back') และ res.location('back'): ไม่รองรับ magic string 'back' อีกต่อไป ให้ใช้ req.get('Referrer') || '/' อย่างชัดเจนแทน
    • signature ของ res.send(status, body) และ res.send(body, status): ให้ใช้ res.status(status).send(body)
    • signature ของ res.send(status): สำหรับการตอบกลับสถานะแบบสั้นให้ใช้ res.sendStatus(status) และหากต้องการส่ง status code พร้อมเนื้อหาแบบเลือกได้ให้ใช้ res.status(status).send()
    • มีการถอด method signature ที่เลิกใช้อื่น ๆ ออกด้วย (ดูรายละเอียดใน migration guide)
  • แนวทางการย้ายระบบและความปลอดภัย

    • มี migration guide แบบละเอียดสำหรับนักพัฒนาที่จะย้ายจาก v4 ไป v5
    • มี threat model แบบครอบคลุมที่ให้ข้อมูลเชิงลึกสำคัญในเรื่องอย่างการตรวจสอบความถูกต้องของอินพุตจากผู้ใช้และแนวปฏิบัติด้านความปลอดภัย เพื่อให้ใช้งาน Express ได้อย่างปลอดภัยและมั่นคง

ความเห็นของ GN⁺

  • Express v5 เป็นรีลีสที่มุ่งเน้นการบอก ecosystem ของ Node.js ว่า Express กลับมาเคลื่อนไหวอีกครั้ง โดยเน้นการยุติการรองรับ Node.js เวอร์ชันเก่า การแก้ปัญหาด้านความปลอดภัย และการทำให้การบำรุงรักษาง่ายขึ้น
  • รีลีสนี้ถูกทำให้เรียบง่ายโดยตั้งใจ เพื่อขจัดอุปสรรคใน ecosystem และเปิดทางให้เกิดการเปลี่ยนแปลงที่ส่งผลมากขึ้นในรีลีสถัดไป
  • Express มีปรัชญาเป็นเว็บเฟรมเวิร์กสำหรับ Node.js ที่รวดเร็ว ไม่ยัดเยียดแนวทาง และมินิมอล ซึ่งช่วยมอบข้อมูลเชิงลึกสำคัญในด้านอย่างการตรวจสอบความถูกต้องของอินพุตจากผู้ใช้และแนวปฏิบัติด้านความปลอดภัย
  • มีทั้งคู่มือแบบละเอียดสำหรับการย้ายไป Express v5 และ threat model แบบครอบคลุม เพื่อช่วยให้นักพัฒนาใช้งาน Express ได้อย่างปลอดภัยและเสถียร
  • ผู้ดูแลชุดใหม่ของโปรเจกต์ Express ตั้งเป้าที่จะพัฒนา ecosystem ของ Express ให้เป็นเครื่องมือที่เสถียรและเชื่อถือได้ โดยจะร่วมมือกับชุมชนเพื่อแก้ปัญหาและปรับปรุงต่อไป

4 ความคิดเห็น

 
aer0700 2024-10-22

อ๋อ ในที่สุดก็รองรับ promise แล้วสินะครับ พวกเรายังใช้ express กันเยอะอยู่เลย 555; เป็นข่าวดีนะครับ

 
vipeen 2024-10-21

ส่วนใหญ่ก็ย้ายไปใช้ nestjs กันหมดแล้ว เลยแทบไม่มีโอกาสได้ใช้โดยตรงเท่าไร จริง ๆ ก็แทบไม่ต่างจากการใช้เซอร์เล็ตโดยตรง

 
chotnt741 2024-10-20

ในที่สุดก็จัดการ promise error ได้แล้ว แต่ตอนนี้ก็ยังไม่ค่อยแน่ใจว่ามีเหตุผลอะไรให้ต้องใช้มันอยู่ดี

 
GN⁺ 2024-10-20
ความคิดเห็นจาก Hacker News
  • อยากแสดงความขอบคุณต่อ Wes และทีม ต้องอ่านซ้ำสองรอบเลยว่า PR ของ v5 ถูกเปิดมาแล้ว 10 ปี คงต้องใช้ความพยายามมหาศาลในการเปลี่ยนแรงเฉื่อยของโปรเจ็กต์นี้ ขอแสดงความยินดีกับบทใหม่

    • เวลาที่ใช้ regular expression บางกรณีอาจเกิดพฤติกรรมแบบใช้เวลาเป็นเลขชี้กำลังในการพาร์สอินพุต ซึ่งหลีกเลี่ยงได้ง่ายด้วยการเปลี่ยนไปใช้เอนจิน regular expression จริงอย่าง re2
    • อ้างอิงบทความของ rsc ชื่อ "Regular Expression Matching Can Be Simple And Fast"
  • ขอแสดงความยินดีกับทีม Express แม้จะมีเว็บเซิร์ฟเวอร์เฟรมเวิร์กของ Node JS อื่น ๆ มากมาย แต่ก็ไม่ย้ายไปใช้อย่างอื่นเพราะ Express มีทุกอย่างที่ต้องการ หวังว่าสถานะนี้จะคงอยู่ต่อไป

  • มีการพูดถึงว่า Express ยังไม่ใช่ latest

  • ขอบคุณ Wes และทีมสำหรับงานที่ทำ Express ยังเป็นตัวเลือกที่ชอบที่สุดบน nodejs และก็ดีที่มีการดูแลอย่างต่อเนื่อง

  • สงสัยว่าทำไมการออก v5 ถึงใช้เวลานานถึง 10 ปี

  • มีการพูดถึง perl 6

  • แนวคิดที่ให้รวมการตอบกลับเป็นส่วนหนึ่งของอินพุตของเส้นทางดูเหมือนเป็นแนวคิดแบบยุค 2010s ทุกวันนี้ของส่วนใหญ่มีเส้นทางที่รับคำขอแล้วส่งคืนการตอบกลับ ซึ่งเข้ากับ HTTP ได้ดีกว่า

  • ไม่เคยเห็นโมเดลแบบ "ย้ายของเดิมไปให้บริษัทเอกชนแล้วให้การสนับสนุน" มาก่อน

  • สงสัยว่า Express เทียบกับ koa, fastify และอื่น ๆ เป็นอย่างไร