Hace diez años (julio de 2014) se abrió el pull request para la versión v5 de Express, y ahora por fin ¡se ha mergeado y publicado!
Queremos reconocer el trabajo de todos nuestros colaboradores, especialmente de Doug Wilson, quien pasó los últimos diez años asegurando que Express fuera el proyecto más estable que existiera. Sin sus contribuciones y las de muchos otros, esta versión no habría sido posible.
Hace ocho meses hicimos público un plan para mover Express hacia adelante. Este plan incluyó recomprometerse con la gobernanza definida hace años y añadir más colaboradores para ayudar a impulsar el progreso. Muchas personas puede que no se den cuenta de que una gobernanza robusta del proyecto es crítica para la salud de un proyecto de código abierto grande. Queremos agradecer al Consejo de Proyectos Cruzados de la OpenJS Foundation y a sus miembros por ayudarnos a armar este plan.
¿Y qué pasa con v5?
¡Esta versión está diseñada para ser aburrida! Puede sonar raro, pero intencionalmente la mantuvimos simple para desbloquear el ecosistema y habilitar cambios más impactantes en futuras versiones. Esto también se trata de señalar al ecosistema de Node.js que Express se está moviendo de nuevo. El enfoque de esta versión está en dejar de soportar versiones antiguas de Node.js, abordar problemas de seguridad y simplificar el mantenimiento.
Antes de entrar en los cambios de esta versión, hablemos de por qué se liberó v5 en el dist-tag next. Como parte de la reactivación del proyecto, iniciamos un grupo de trabajo de seguridad y un equipo de triaje de seguridad para abordar las crecientes necesidades en torno a la seguridad de la cadena de suministro de código abierto. Realizamos una auditoría de seguridad (más detalles próximamente) y descubrimos algunos problemas que necesitaban ser abordados. Por lo tanto, además del trabajo “normal” hecho en issues públicos, también hicimos mucho trabajo de seguridad en forks privados.
Este trabajo de seguridad requirió orquestación al liberar, para asegurar que el código y los reportes CVE salieran juntos. Puedes encontrar un resumen de las vulnerabilidades más recientes parchadas en nuestras notas de la versión de seguridad.
Aunque no pudimos liberar simultáneamente v5, esta publicación del blog, el changelog y la documentación, sentimos que lo más importante era tener una versión segura y estable.
Lo antes posible, proporcionaremos más detalles sobre nuestros planes de soporte a largo plazo (LTS), incluyendo cuándo la versión pasará de next a latest. Por ahora, si no te sientes cómodo estando en el borde filoso (incluso si es un borde bastante roma) entonces deberías esperar para actualizar hasta que la versión esté etiquetada como latest. Dicho esto, esperamos trabajar contigo para abordar cualquier bug que encuentres al actualizar.
Cambios disruptivos
La versión v5 tiene la cantidad mínima posible de cambios disruptivos, listados aquí en orden de impacto para las aplicaciones.
- ¿Y qué pasa con v5?
- Cambios disruptivos
- Guía de migración y seguridad
- Nuestro trabajo recién comienza
También hay una serie de cambios sutiles: para más detalles, ver Migración a Express 5.
Fin de soporte para versiones antiguas de Node.js
¡Adiós Node.js 0.10, hola Node 18 y superior!
Esta versión deja de soportar versiones de Node.js anteriores a v18. Este es un cambio importante porque soportar versiones antiguas de Node.js ha estado frenando muchos cambios críticos de rendimiento y mantenibilidad. Este cambio también habilita una integración continua (CI) más estable y mantenible, la adopción de nuevas características del lenguaje y del runtime, y la eliminación de dependencias que ya no son necesarias.
Reconocemos que esto puede causar dificultades para algunas empresas con aplicaciones antiguas o “estacionadas”, y por eso estamos trabajando en una asociación con HeroDevs para ofrecer “soporte infinito” que incluirá parches críticos de seguridad incluso después de que v4 entre en fin de vida útil (más sobre estos planes pronto). Dicho esto, sugerimos encarecidamente que actualices a versiones modernas de Node.js lo antes posible.
Cambios en la coincidencia de rutas y expresiones regulares
La versión v5 actualiza path-to-regexp@8.x desde path-to-regexp@0.x, lo que incorpora muchos años de cambios. Si estabas usando alguna de las versiones beta 5.0.0, una actualización de último minuto cambió enormemente la semántica de rutas para eliminar la posibilidad de cualquier ataque ReDoS. Para cambios más detallados, ver el readme de path-to-regexp.
Se acabaron las regex
Esta versión ya no soporta expresiones regulares de “sub-expresión”, por ejemplo /:foo(\\d+).
Este es un patrón comúnmente usado, pero lo eliminamos por razones de seguridad. Desafortunadamente, es fácil escribir una expresión regular que tenga un comportamiento de tiempo exponencial al parsear entrada: el temido ataque de denegación de servicio por expresiones regulares (ReDoS). Es muy difícil prevenir esto, pero como una librería que convierte cadenas a expresiones regulares, somos responsables de estos aspectos de seguridad.
Cómo migrar: El mejor enfoque para prevenir ataques ReDoS es usar una librería robusta de validación de entrada. Hay muchas en npm dependiendo de tus necesidades. El miembro del TC Wes Todd mantiene una librería OpenAPI “code first” basada en middleware para este tipo de cosas.
Splats, opcionales y capturas, oh vaya
Esta versión incluye patrones simplificados para patrones de rutas comunes. Con la eliminación de la semántica de expresiones regulares vienen otros cambios pequeños pero impactantes en cómo escribes tus rutas.
:name?se convierte en{:name}. El uso de{}para partes opcionales de tu ruta significa que ahora puedes hacer cosas como/base{/:optional}/:requiredy qué partes son realmente opcionales es mucho más explícito.*se convierte en*name.- Nuevos caracteres reservados:
(,),[,],?,+, y!. Estos han sido reservados para dejar espacio para futuras mejoras y para prevenir errores al migrar donde esos caracteres significan cosas específicas en versiones anteriores.
Nombra todo
Esta versión ya no soporta parámetros numéricos ordenados.
En Express v4, podías obtener parámetros numéricos usando grupos de captura regex (por ejemplo, /user(s?) => req.params[0] === 's'). Ahora todos los parámetros deben ser nombrados. Junto con requerir un nombre, Express ahora soporta todos los identificadores válidos de JavaScript o entre comillas (por ejemplo, /:"this").
Soporte de Promise
Este puede ser un poco controvertido, pero “prometemos” que vamos en la dirección correcta. Añadimos soporte para promises rechazadas devueltas desde errores lanzados en middleware. Esto no incluye llamar next desde promises resueltas devueltas. Hay muchos casos límite en aplicaciones antiguas de Express que tienen expectativas sobre el comportamiento de Promise, y antes de poder correr necesitamos caminar. Para la mayoría, esto significa que ahora puedes escribir middleware como el siguiente:
app.use(async (req, res, next) => { req.locals.user = await getUser(req); next();});Nota que este ejemplo usa async/await y la llamada a getUser puede lanzar un error (si, por ejemplo, el usuario no existe, la base de datos de usuarios está caída, etc.), pero seguimos llamando next si es exitoso. Ya no necesitamos capturar el error en línea si queremos depender del middleware de manejo de errores porque el router ahora capturará el promise rechazado y lo tratará como llamar next(err).
NOTA: La mejor práctica es manejar los errores lo más cerca posible del sitio. Así que aunque ahora esto se maneja en el router, es mejor capturar el error en el middleware y manejarlo sin depender de un middleware separado de manejo de errores.
Cambios en body parser
Hay una serie de cambios en body-parser:
- Añadida opción para personalizar la profundidad del cuerpo urlencoded con un valor por defecto de 32 como mitigación para CVE-2024-45590 (detalles técnicos)
- Eliminado el middleware de combinación
bodyParser()deprecado req.bodyya no siempre se inicializa a{}- El parser
urlencodedahora por defecto estableceextendeden false - Añadido soporte para compresión de datos sin pérdida Brotli
Eliminación de firmas de métodos deprecadas
Express v5 elimina una serie de firmas de métodos deprecadas, muchas de las cuales se arrastraban desde v3. A continuación están los cambios que debes hacer:
res.redirect('back')yres.location('back'): La cadena mágica'back'ya no está soportada. Usareq.get('Referrer') || '/'explícitamente en su lugar.res.send(status, body)yres.send(body, status): Usares.status(status).send(body).res.send(status): Usares.sendStatus(status)para respuestas simples de estado, ores.status(status).send()para enviar un código de estado con un cuerpo opcional.res.redirect(url, status): Usares.redirect(status, url).res.json(status, obj)yres.json(obj, status): Usares.status(status).json(obj).res.jsonp(status, obj)yres.jsonp(obj, status): Usares.status(status).jsonp(obj).app.param(fn): Este método ha sido deprecado. En su lugar, accede a los parámetros directamente víareq.params, o usareq.bodyoreq.querysegún sea necesario.app.del('/', () => {}): Usaapp.delete('/', () => {})en su lugar.req.acceptsCharset: Usareq.acceptsCharsets(plural).req.acceptsEncoding: Usareq.acceptsEncodings(plural).req.acceptsLanguage: Usareq.acceptsLanguages(plural).res.sendfile: Usares.sendFileen su lugar.
Como framework, nuestro objetivo es asegurar que la API sea lo más consistente posible. Hemos eliminado estas firmas deprecadas para hacer la API más predecible y fácil de usar. Al simplificar cada método para usar una única firma consistente, simplificamos la experiencia del desarrollador y reducimos la confusión.
Guía de migración y seguridad
Para desarrolladores que buscan migrar de v4 a v5, hay una guía de migración detallada para ayudarte a navegar por los cambios y asegurar un proceso de actualización fluido.
Además, hemos estado trabajando duro en un Modelo de Amenazas completo que ayuda a ilustrar nuestra filosofía de un “framework web rápido, sin opiniones y minimalista para Node.js.” Proporciona información crítica sobre áreas como validación de entrada del usuario y prácticas de seguridad que son esenciales para un uso seguro de Express en tus aplicaciones.
Nuestro trabajo recién comienza
Vemos la versión v5 como un hito hacia un ecosistema de Express que sea una herramienta estable y confiable para empresas, gobiernos, educadores y proyectos personales. Es nuestro compromiso como los nuevos administradores del proyecto Express mover el ecosistema hacia adelante con este objetivo en mente. Si quieres apoyar este trabajo, que hacemos de forma voluntaria, por favor considera apoyar al proyecto y a sus mantenedores a través de nuestras oportunidades de patrocinio.
Tenemos un amplio backlog de trabajo de tareas, PRs e issues para Express y sus dependencias. Naturalmente, esperamos que los desarrolladores sigan reportando issues para añadir a este backlog y abriendo PRs en el futuro, y seguiremos colaborando con la comunidad para triage y resolverlos. Esperamos seguir mejorando Express y haciéndolo útil para sus usuarios en todo el mundo.