7 điểm bởi GN⁺ 2024-10-20 | 4 bình luận | Chia sẻ qua WhatsApp
  • PR v5 đầu tiên được mở từ 10 năm trước, nay cuối cùng đã được merge và phát hành
  • Đây là một bản phát hành được cố ý đơn giản hóa để có thể triển khai những thay đổi có tác động lớn hơn trong các bản phát hành sắp tới
  • Đồng thời cũng là cách để báo cho hệ sinh thái Node.js biết rằng Express đã chuyển động trở lại

Những thay đổi chính

  • Thay đổi hỗ trợ phiên bản Node.js

    • Ngừng hỗ trợ Node.js 0.10, chuyển sang chỉ hỗ trợ Node 18 trở lên
    • Giải quyết vấn đề các thay đổi quan trọng về hiệu năng và bảo trì bị trì hoãn do phải hỗ trợ các phiên bản Node.js cũ
    • Giờ đây có thể áp dụng các tính năng ngôn ngữ và runtime mới, đồng thời loại bỏ các dependency không còn cần thiết
    • Nhận thức được khó khăn của các doanh nghiệp đang dùng phiên bản Node.js cũ, dự án sẽ hợp tác với HeroDevs để cung cấp "hỗ trợ vô thời hạn", tiếp tục cung cấp các bản vá bảo mật quan trọng sau khi v4 kết thúc hỗ trợ
  • Thay đổi về khớp đường dẫn và biểu thức chính quy

    • Thư viện path-to-regexp được nâng từ 0.x lên 8.x, tích hợp nhiều thay đổi tích lũy qua nhiều năm
    • Ngừng hỗ trợ các biểu thức con regex (ví dụ: /:foo(\\d+))
      • Bị loại bỏ để ngăn chặn tấn công ReDoS
      • Cách migrate: khuyến nghị dùng thư viện kiểm tra tính hợp lệ đầu vào mạnh mẽ
    • Bao gồm các pattern đơn giản hóa cho những mẫu đường dẫn phổ biến
      • :name? được đổi thành {:name}
      • * được đổi thành *name
      • (, ), [, ], ?, +, ! được thêm vào danh sách ký tự dành riêng
    • Ngừng hỗ trợ tham số số theo thứ tự. Mọi tham số đều phải được đặt tên
  • Hỗ trợ Promise

    • Bổ sung hỗ trợ cho Promise bị reject do lỗi phát sinh trong middleware
    • Không bao gồm việc gọi next từ Promise đã resolve
    • Trong hầu hết trường hợp, giờ có thể viết middleware như sau:
      app.use(async (req, res, next) => {  
        req.locals.user = await getUser(req);  
        next();  
      });  
      
  • Thay đổi ở body parser

    • Thêm tùy chọn tùy chỉnh độ sâu của urlencoded body để giảm thiểu CVE-2024-45590 (mặc định là 32)
    • Loại bỏ middleware kết hợp bodyParser() đã bị deprecated
    • req.body không còn luôn được khởi tạo là {} nữa
    • Giá trị mặc định của extended trong parser urlencoded được đổi thành false
    • Thêm hỗ trợ nén dữ liệu không mất mát Brotli
  • Loại bỏ các method signature đã deprecated

    • res.redirect('back')res.location('back'): không còn hỗ trợ chuỗi đặc biệt 'back'. Thay vào đó, hãy dùng tường minh req.get('Referrer') || '/'
    • Signature res.send(status, body)res.send(body, status): dùng res.status(status).send(body)
    • Signature res.send(status): với phản hồi trạng thái đơn giản, dùng res.sendStatus(status); để gửi mã trạng thái kèm phần thân tùy chọn, dùng res.status(status).send()
    • Các method signature deprecated khác cũng đã bị loại bỏ (xem migration guide để biết chi tiết)
  • Hướng dẫn migrate và bảo mật

    • Cung cấp migration guide chi tiết cho các nhà phát triển chuyển từ v4 sang v5
    • Cung cấp threat model toàn diện, đưa ra những góc nhìn quan trọng về các lĩnh vực như kiểm tra đầu vào người dùng và thực hành bảo mật, nhằm giúp sử dụng Express an toàn hơn

Ý kiến của GN⁺

  • Express v5 là bản phát hành tập trung vào việc cho hệ sinh thái Node.js thấy rằng Express đang chuyển động trở lại. Trọng tâm là ngừng hỗ trợ các phiên bản Node.js cũ, xử lý vấn đề bảo mật và đơn giản hóa việc bảo trì
  • Bản phát hành này được giữ đơn giản một cách có chủ đích để loại bỏ các rào cản trong hệ sinh thái và mở đường cho những thay đổi có tác động lớn hơn ở các bản phát hành sau
  • Express theo đuổi triết lý là một web framework nhanh, tối giản và không áp đặt cho Node.js. Điều này cũng mang lại những góc nhìn quan trọng ở các lĩnh vực như kiểm tra đầu vào người dùng và thực hành bảo mật
  • Có sẵn hướng dẫn chi tiết để migrate lên Express v5 cùng với threat model toàn diện, giúp nhà phát triển sử dụng Express một cách an toàn và ổn định
  • Những maintainer mới của dự án Express đặt mục tiêu phát triển hệ sinh thái Express thành bộ công cụ ổn định và đáng tin cậy. Vì vậy, họ sẽ tiếp tục hợp tác với cộng đồng để giải quyết vấn đề và cải thiện dự án

4 bình luận

 
aer0700 2024-10-22

À, cuối cùng cũng hỗ trợ promise rồi nhỉ. Bên mình vẫn còn dùng express khá nhiều nên haha; đúng là tin vui.

 
vipeen 2024-10-21

Phần lớn đã chuyển sang nestjs nên giờ hầu như không còn dịp dùng trực tiếp nữa. Gần như cũng giống như dùng trực tiếp Servlet vậy.

 
chotnt741 2024-10-20

Cuối cùng cũng đã có thể xử lý lỗi promise, nhưng đến lúc này thì tôi cũng không rõ có lý do gì để nhất thiết phải dùng nó nữa.

 
GN⁺ 2024-10-20
Ý kiến trên Hacker News
  • Muốn bày tỏ lời cảm ơn tới Wes và cả đội. Phải đọc lại hai lần mới tin rằng PR cho v5 đã được mở từ 10 năm trước. Hẳn đã cần một nỗ lực rất lớn để thay đổi quán tính của dự án này. Chúc mừng chương mới

    • Khi dùng biểu thức chính quy, có những trường hợp việc phân tích đầu vào dẫn đến hành vi thời gian theo cấp số mũ. Có thể dễ dàng tránh điều này bằng cách chuyển sang một engine regex thực thụ như re2
    • Có thể tham khảo bài viết của rsc "Regular Expression Matching Can Be Simple And Fast"
  • Xin chúc mừng đội ngũ Express. Có rất nhiều framework máy chủ web Node JS khác, nhưng tôi chưa chuyển sang cái khác vì Express cung cấp mọi thứ tôi cần. Hy vọng điều này sẽ tiếp tục

  • Có nhắc đến việc Express vẫn chưa phải là latest

  • Cảm ơn Wes và cả đội vì công sức của họ. Express vẫn là lựa chọn được ưa thích nhất trên nodejs, và thật tuyệt khi thấy nó được duy trì tích cực

  • Tò mò vì sao việc phát hành v5 lại mất tới 10 năm

  • Nhắc đến perl 6

  • Ý tưởng đưa phản hồi vào như một phần của đầu vào tuyến đường có vẻ là kiểu của thập niên 2010. Ngày nay, hầu hết mọi thứ đều có các tuyến đường nhận request và trả về response. Cách này phù hợp với HTTP hơn

  • Chưa từng thấy mô hình "chuyển phiên bản cũ sang một công ty tư nhân để cung cấp hỗ trợ"

  • Tò mò Express so với koa, fastify, v.v. như thế nào