diff --git a/_data/de/footer.yml b/_data/de/footer.yml
index c04d2822d0..7ca317f1bb 100644
--- a/_data/de/footer.yml
+++ b/_data/de/footer.yml
@@ -3,4 +3,4 @@ privacy_policy: Privacy Policy
coc: Code of Conduct
trademark_policy: Trademark Policy
security_policy: Security Policy
-license: Lizenzvertrag
\ No newline at end of file
+license: Lizenzvertrag
diff --git a/_data/de/general.yml b/_data/de/general.yml
new file mode 100644
index 0000000000..1ed861c663
--- /dev/null
+++ b/_data/de/general.yml
@@ -0,0 +1,6 @@
+title_announcement: "Express@5.1.0: Now the Default on npm with LTS Timeline"
+body_announcement: "Express 5.1.0 is now the default on npm, and we're introducing an official LTS schedule for the v4 and v5 release lines. Check out our latest blog for more information."
+community-caveat-alert: "This information refers to third-party sites, products, or modules that are not maintained by the Expressjs team. Listing here does not constitute an endorsement or recommendation from the Expressjs project team."
+warning: 'Warning'
+note: 'Note'
+caution: 'Caution'
diff --git a/_data/de/menu.yml b/_data/de/menu.yml
index 0abd814019..d524e0ace1 100644
--- a/_data/de/menu.yml
+++ b/_data/de/menu.yml
@@ -1,19 +1,17 @@
# Home
home: Home
-
# Getting started
getting_started: Einführung
-installing: Installing
+installing: Installation
hello_world: Hello world
generator: Express generator
basic_routing: Basisrouting
static_files: Statische Dateien
examples: More examples
faq: Häufig gestellte Fragen
-
# Guide
guide: Leitfaden
-routing: Routing
+routing: Weiterleitung (Routing)
writing_middleware: Middleware schreiben
using_middleware: Middleware verwenden
overriding_express_api: Overriding the Express API
@@ -24,15 +22,12 @@ behind_proxies: Express hinter Proxys
migrating_4: Wechsel zu Express 4
migrating_5: Wechsel zu Express 5
database_integration: Datenbankintegration
-
# API reference
-
api: API-Referenz
5x: 5.x
4x: 4.x
3x: 3.x (veraltet)
2x: 2.x (veraltet)
-
# Advanced topics
advanced: Themen für Fortgeschrittene
developing_template_engines: Template-Engines
@@ -40,7 +35,6 @@ security_updates: Sicherheitsupdates
best_practice_security: Sicherheitsspezifische Best Practices
best_practice_performance: Leistungsspezifische Best Practices
healthcheck_graceful_shutdown: Health checks & shutdown
-
# Resources
resources: Ressourcen
glossary: Glossar
@@ -49,10 +43,8 @@ community: Community
utils: Utility modules
contributing: Contributing to Express
changelog: Release Change Log
-
# Support
support: Support
-
# Blog
blog: Blog
latest_post: Latest post
diff --git a/_data/es/footer.yml b/_data/es/footer.yml
index b768e5f900..420659956c 100644
--- a/_data/es/footer.yml
+++ b/_data/es/footer.yml
@@ -3,4 +3,4 @@ privacy_policy: Política de privacidad
coc: Código de conducta
trademark_policy: Política de marcas
security_policy: Seguridad
-license: Licencia
\ No newline at end of file
+license: Licencia
diff --git a/_data/es/general.yml b/_data/es/general.yml
new file mode 100644
index 0000000000..1ed861c663
--- /dev/null
+++ b/_data/es/general.yml
@@ -0,0 +1,6 @@
+title_announcement: "Express@5.1.0: Now the Default on npm with LTS Timeline"
+body_announcement: "Express 5.1.0 is now the default on npm, and we're introducing an official LTS schedule for the v4 and v5 release lines. Check out our latest blog for more information."
+community-caveat-alert: "This information refers to third-party sites, products, or modules that are not maintained by the Expressjs team. Listing here does not constitute an endorsement or recommendation from the Expressjs project team."
+warning: 'Warning'
+note: 'Note'
+caution: 'Caution'
diff --git a/_data/es/menu.yml b/_data/es/menu.yml
index fbc3e1f781..4e6360588b 100644
--- a/_data/es/menu.yml
+++ b/_data/es/menu.yml
@@ -1,16 +1,14 @@
# Home
home: Inicio
-
# Getting started
getting_started: Cómo empezar
-installing: Instalación
-hello_world: Hello world
-generator: Generador de Express
+installing: Instalando
+hello_world: Hola mundo
+generator: Generador express
basic_routing: Direccionamiento básico
static_files: Archivos estáticos
-examples: More examples
-faq: Preguntas más frecuentes
-
+examples: Más ejemplos
+faq: FAQ
# Guide
guide: Guía
routing: Direccionamiento
@@ -24,14 +22,12 @@ behind_proxies: Express detrás de proxies
migrating_4: Migración a Express 4
migrating_5: Migración a Express 5
database_integration: Integración de la base de datos
-
# API reference
api: Referencia de API
5x: 5.x
4x: 4.x
-3x: 3.x (en desuso)
-2x: 2.x (en desuso)
-
+3x: 3.x (obsoleto)
+2x: 2.x (obsoleto)
# Advanced topics
advanced: Temas avanzados
developing_template_engines: Motores de plantilla
@@ -39,21 +35,18 @@ security_updates: Actualizaciones de seguridad
best_practice_security: Mejores prácticas de seguridad
best_practice_performance: Mejores prácticas de rendimiento
healthcheck_graceful_shutdown: Health checks & shutdown
-
# Resources
resources: Recursos
glossary: Glosario
middleware: Middleware
community: Comunidad
utils: Utility modules
-contributing: Contributing to Express
+contributing: Contribuir a Express
changelog: Release Change Log
-
# Support
support: Support
-
# Blog
blog: Blog
latest_post: Latest post
all_posts: All posts
-write_post: Write a Post
+write_post: Escribir un post
diff --git a/_data/fr/footer.yml b/_data/fr/footer.yml
index 6d3291d58c..fe92f52ca8 100644
--- a/_data/fr/footer.yml
+++ b/_data/fr/footer.yml
@@ -3,4 +3,4 @@ privacy_policy: Privacy Policy
coc: Code of Conduct
trademark_policy: Trademark Policy
security_policy: Security Policy
-license: License
\ No newline at end of file
+license: License
diff --git a/_data/fr/general.yml b/_data/fr/general.yml
new file mode 100644
index 0000000000..1ed861c663
--- /dev/null
+++ b/_data/fr/general.yml
@@ -0,0 +1,6 @@
+title_announcement: "Express@5.1.0: Now the Default on npm with LTS Timeline"
+body_announcement: "Express 5.1.0 is now the default on npm, and we're introducing an official LTS schedule for the v4 and v5 release lines. Check out our latest blog for more information."
+community-caveat-alert: "This information refers to third-party sites, products, or modules that are not maintained by the Expressjs team. Listing here does not constitute an endorsement or recommendation from the Expressjs project team."
+warning: 'Warning'
+note: 'Note'
+caution: 'Caution'
diff --git a/_data/fr/menu.yml b/_data/fr/menu.yml
index 6e332938af..e458f9dab5 100644
--- a/_data/fr/menu.yml
+++ b/_data/fr/menu.yml
@@ -1,16 +1,14 @@
# Home
home: Accueil
-
# Getting started
getting_started: Mise en route
-installing: Installing
+installing: Installation
hello_world: Hello world
generator: Générateur Express
basic_routing: Routage de base
static_files: Fichiers statiques
examples: More examples
faq: FAQ
-
# Guide
guide: Guide
routing: Routage
@@ -24,15 +22,12 @@ behind_proxies: Express derrière Proxys
migrating_4: Migration vers Express 4
migrating_5: Migration vers Express 5
database_integration: Intégration de bases de données
-
# API reference
-
api: API reference
5x: 5.x
4x: 4.x
3x: 3.x (obsolète)
2x: 2.x (obsolète)
-
# Advanced topics
advanced: Rubriques avancées
developing_template_engines: Moteurs de modèles
@@ -40,7 +35,6 @@ security_updates: Mises à jour de sécurité
best_practice_security: Meilleures pratiques en termes de sécurité
best_practice_performance: Meilleures pratiques en termes de performances
healthcheck_graceful_shutdown: Health checks & shutdown
-
# Resources
resources: Ressources
glossary: Glossaire
@@ -49,10 +43,8 @@ community: Communauté
utils: Utility modules
contributing: Contributing to Express
changelog: Release Change Log
-
# Support
support: Support
-
# Blog
blog: Blog
latest_post: Latest post
diff --git a/_data/it/footer.yml b/_data/it/footer.yml
index 6d3291d58c..fe92f52ca8 100644
--- a/_data/it/footer.yml
+++ b/_data/it/footer.yml
@@ -3,4 +3,4 @@ privacy_policy: Privacy Policy
coc: Code of Conduct
trademark_policy: Trademark Policy
security_policy: Security Policy
-license: License
\ No newline at end of file
+license: License
diff --git a/_data/it/general.yml b/_data/it/general.yml
new file mode 100644
index 0000000000..1ed861c663
--- /dev/null
+++ b/_data/it/general.yml
@@ -0,0 +1,6 @@
+title_announcement: "Express@5.1.0: Now the Default on npm with LTS Timeline"
+body_announcement: "Express 5.1.0 is now the default on npm, and we're introducing an official LTS schedule for the v4 and v5 release lines. Check out our latest blog for more information."
+community-caveat-alert: "This information refers to third-party sites, products, or modules that are not maintained by the Expressjs team. Listing here does not constitute an endorsement or recommendation from the Expressjs project team."
+warning: 'Warning'
+note: 'Note'
+caution: 'Caution'
diff --git a/_data/it/menu.yml b/_data/it/menu.yml
index b8a5fbb6e0..38544bad5a 100644
--- a/_data/it/menu.yml
+++ b/_data/it/menu.yml
@@ -1,6 +1,5 @@
# Home
home: Home
-
# Getting started
getting_started: Introduzione
installing: Installazione
@@ -10,7 +9,6 @@ basic_routing: Routing di base
static_files: File statici
examples: More examples
faq: FAQ
-
# Guide
guide: Guide
routing: Routing
@@ -24,15 +22,12 @@ behind_proxies: Express con i proxy
migrating_4: Passaggio a Express 4
migrating_5: Passaggio a Express 5
database_integration: Integrazione database
-
# API reference
-
api: Riferimento API
5x: 5.x
4x: 4.x
3x: 3.x (deprecato)
2x: 2.x (deprecato)
-
# Advanced topics
advanced: Argomenti avanzati
developing_template_engines: Motori di template
@@ -40,19 +35,16 @@ security_updates: Aggiornamenti sulla sicurezza
best_practice_security: Best practice sulla sicurezza
best_practice_performance: Best practice sulle prestazioni
healthcheck_graceful_shutdown: Health checks & shutdown
-
# Resources
resources: Risorse
-glossary: Glossary
+glossary: Glossario
middleware: Middleware
community: Community
utils: Utility modules
contributing: Contributing to Express
changelog: Release Change Log
-
# Support
support: Support
-
# Blog
blog: Blog
latest_post: Latest post
diff --git a/_data/ja/footer.yml b/_data/ja/footer.yml
index 6d3291d58c..fe92f52ca8 100644
--- a/_data/ja/footer.yml
+++ b/_data/ja/footer.yml
@@ -3,4 +3,4 @@ privacy_policy: Privacy Policy
coc: Code of Conduct
trademark_policy: Trademark Policy
security_policy: Security Policy
-license: License
\ No newline at end of file
+license: License
diff --git a/_data/ja/general.yml b/_data/ja/general.yml
new file mode 100644
index 0000000000..1ed861c663
--- /dev/null
+++ b/_data/ja/general.yml
@@ -0,0 +1,6 @@
+title_announcement: "Express@5.1.0: Now the Default on npm with LTS Timeline"
+body_announcement: "Express 5.1.0 is now the default on npm, and we're introducing an official LTS schedule for the v4 and v5 release lines. Check out our latest blog for more information."
+community-caveat-alert: "This information refers to third-party sites, products, or modules that are not maintained by the Expressjs team. Listing here does not constitute an endorsement or recommendation from the Expressjs project team."
+warning: 'Warning'
+note: 'Note'
+caution: 'Caution'
diff --git a/_data/ja/menu.yml b/_data/ja/menu.yml
index 9ceef0ced8..2eee50b2a4 100644
--- a/_data/ja/menu.yml
+++ b/_data/ja/menu.yml
@@ -1,6 +1,5 @@
# Home
home: ホーム
-
# Getting started
getting_started: 概説
installing: インストール
@@ -10,7 +9,6 @@ basic_routing: 基本的なルーティング
static_files: 静的ファイル
examples: More examples
faq: FAQ
-
# Guide
guide: ガイド
routing: ルーティング
@@ -24,15 +22,12 @@ behind_proxies: プロキシーの背後の Express
migrating_4: Express 4 への移行
migrating_5: Express 5 への移行
database_integration: データベースの統合
-
# API reference
-
api: API リファレンス
5x: 5.x
4x: 4.x
3x: 3.x (非推奨)
2x: 2.x (非推奨)
-
# Advanced topics
advanced: 高度なトピック
developing_template_engines: テンプレート・エンジン
@@ -40,7 +35,6 @@ security_updates: セキュリティー更新
best_practice_security: セキュリティーに関するベスト・プラクティス
best_practice_performance: パフォーマンスに関するベスト・プラクティス
healthcheck_graceful_shutdown: Health checks & shutdown
-
# Resources
resources: リソース
glossary: 用語集
@@ -49,10 +43,8 @@ community: コミュニティー
utils: Utility modules
contributing: Contributing to Express
changelog: Release Change Log
-
# Support
support: Support
-
# Blog
blog: Blog
latest_post: Latest post
diff --git a/_data/ko/footer.yml b/_data/ko/footer.yml
index 6d3291d58c..fe92f52ca8 100644
--- a/_data/ko/footer.yml
+++ b/_data/ko/footer.yml
@@ -3,4 +3,4 @@ privacy_policy: Privacy Policy
coc: Code of Conduct
trademark_policy: Trademark Policy
security_policy: Security Policy
-license: License
\ No newline at end of file
+license: License
diff --git a/_data/ko/general.yml b/_data/ko/general.yml
index 2903d0067a..1ed861c663 100644
--- a/_data/ko/general.yml
+++ b/_data/ko/general.yml
@@ -1,8 +1,6 @@
-title_announcement: "Express 5.0 documentation is now available."
-body_announcement: "The API documentation is a work in progress. For information on what's in the release, see the Express release history"
-
+title_announcement: "Express@5.1.0: Now the Default on npm with LTS Timeline"
+body_announcement: "Express 5.1.0 is now the default on npm, and we're introducing an official LTS schedule for the v4 and v5 release lines. Check out our latest blog for more information."
community-caveat-alert: "This information refers to third-party sites, products, or modules that are not maintained by the Expressjs team. Listing here does not constitute an endorsement or recommendation from the Expressjs project team."
-
warning: 'Warning'
note: 'Note'
-caution: 'Caution'
\ No newline at end of file
+caution: 'Caution'
diff --git a/_data/ko/menu.yml b/_data/ko/menu.yml
index b8ecb43be9..7bef82a1e8 100644
--- a/_data/ko/menu.yml
+++ b/_data/ko/menu.yml
@@ -1,6 +1,5 @@
# Home
home: 홈
-
# Getting started
getting_started: 시작하기
installing: 설치
@@ -10,9 +9,8 @@ basic_routing: 기본 라우팅
static_files: 정적 파일
examples: More examples
faq: 자주 묻는 질문(FAQ)
-
# Guide
-guide: 안내서
+guide: Gu안내서ide
routing: 라우팅
writing_middleware: 미들웨어 작성
using_middleware: 미들웨어 사용
@@ -24,15 +22,12 @@ behind_proxies: 프록시 환경에서 Express 사용
migrating_4: Express 4로의 이전
migrating_5: Express 5로의 이전
database_integration: 데이터베이스 통합
-
# API reference
-
api: API 참조
5x: 5.x
4x: 4.x
3x: 3.x(더 이상 사용되지 않음)
2x: 2.x(더 이상 사용되지 않음)
-
# Advanced topics
advanced: 고급 주제
developing_template_engines: 템플리트 엔진
@@ -40,7 +35,6 @@ security_updates: 보안 업데이트
best_practice_security: 보안 우수 사례
best_practice_performance: 성능 우수 사례
healthcheck_graceful_shutdown: Health checks & shutdown
-
# Resources
resources: 자원
glossary: 용어집
@@ -49,10 +43,8 @@ community: 커뮤니티
utils: Utility modules
contributing: Contributing to Express
changelog: Release Change Log
-
# Support
support: Support
-
# Blog
blog: Blog
latest_post: Latest post
diff --git a/_data/pt-br/footer.yml b/_data/pt-br/footer.yml
index 5db69348bf..333dfebf6e 100644
--- a/_data/pt-br/footer.yml
+++ b/_data/pt-br/footer.yml
@@ -3,4 +3,4 @@ privacy_policy: Política de Privacidade
coc: Código de Conduta
trademark_policy: Política de Marcas
security_policy: Política de Segurança
-license: Licença
\ No newline at end of file
+license: Licença
diff --git a/_data/pt-br/general.yml b/_data/pt-br/general.yml
index 2903d0067a..1ed861c663 100644
--- a/_data/pt-br/general.yml
+++ b/_data/pt-br/general.yml
@@ -1,8 +1,6 @@
-title_announcement: "Express 5.0 documentation is now available."
-body_announcement: "The API documentation is a work in progress. For information on what's in the release, see the Express release history"
-
+title_announcement: "Express@5.1.0: Now the Default on npm with LTS Timeline"
+body_announcement: "Express 5.1.0 is now the default on npm, and we're introducing an official LTS schedule for the v4 and v5 release lines. Check out our latest blog for more information."
community-caveat-alert: "This information refers to third-party sites, products, or modules that are not maintained by the Expressjs team. Listing here does not constitute an endorsement or recommendation from the Expressjs project team."
-
warning: 'Warning'
note: 'Note'
-caution: 'Caution'
\ No newline at end of file
+caution: 'Caution'
diff --git a/_data/pt-br/menu.yml b/_data/pt-br/menu.yml
index 4b6d49b40b..c481f58273 100644
--- a/_data/pt-br/menu.yml
+++ b/_data/pt-br/menu.yml
@@ -1,6 +1,5 @@
# Home
home: Página Inicial
-
# Getting started
getting_started: Introdução
installing: Instalação
@@ -9,8 +8,7 @@ generator: Gerador do Express
basic_routing: Roteamento Básico
static_files: Arquivos Estáticos
examples: Perguntas mais frequentes
-faq: FAQ
-
+faq: Perguntas mais frequentes
# Guide
guide: Guide
routing: Roteamento
@@ -24,15 +22,12 @@ behind_proxies: Express atrás de proxies
migrating_4: Migrando para o Express 4
migrating_5: Migrando para o Express 5
database_integration: Integração de Banco de dados
-
# API reference
-
api: Referência da API
5x: 5.x
4x: 4.x
3x: 3.x (descontinuada)
2x: 2.x (descontinuada)
-
# Advanced topics
advanced: Tópicos Avançados
developing_template_engines: Mecanismos de modelo
@@ -40,7 +35,6 @@ security_updates: Atualizações de segurança
best_practice_security: Melhores práticas de segurança
best_practice_performance: Melhores práticas de desempenho
healthcheck_graceful_shutdown: Health checks & shutdown
-
# Resources
resources: Recursos
glossary: Glossário
@@ -49,10 +43,8 @@ community: Comunidade
utils: Utility modules
contributing: Contributing to Express
changelog: Release Change Log
-
# Support
support: Suporte
-
# Blog
blog: Blog
latest_post: Ultimos post
diff --git a/_data/zh-cn/footer.yml b/_data/zh-cn/footer.yml
index 6d3291d58c..fe92f52ca8 100644
--- a/_data/zh-cn/footer.yml
+++ b/_data/zh-cn/footer.yml
@@ -3,4 +3,4 @@ privacy_policy: Privacy Policy
coc: Code of Conduct
trademark_policy: Trademark Policy
security_policy: Security Policy
-license: License
\ No newline at end of file
+license: License
diff --git a/_data/zh-cn/general.yml b/_data/zh-cn/general.yml
new file mode 100644
index 0000000000..1ed861c663
--- /dev/null
+++ b/_data/zh-cn/general.yml
@@ -0,0 +1,6 @@
+title_announcement: "Express@5.1.0: Now the Default on npm with LTS Timeline"
+body_announcement: "Express 5.1.0 is now the default on npm, and we're introducing an official LTS schedule for the v4 and v5 release lines. Check out our latest blog for more information."
+community-caveat-alert: "This information refers to third-party sites, products, or modules that are not maintained by the Expressjs team. Listing here does not constitute an endorsement or recommendation from the Expressjs project team."
+warning: 'Warning'
+note: 'Note'
+caution: 'Caution'
diff --git a/_data/zh-cn/menu.yml b/_data/zh-cn/menu.yml
index cb569aa801..c0fe7b7a8c 100644
--- a/_data/zh-cn/menu.yml
+++ b/_data/zh-cn/menu.yml
@@ -1,6 +1,5 @@
# Home
home: 主页
-
# Getting started
getting_started: 入门
installing: 安装
@@ -10,7 +9,6 @@ basic_routing: 基本路由
static_files: 静态文件
examples: More examples
faq: 常见问题及解答
-
# Guide
guide: 指南
routing: 路由
@@ -24,15 +22,12 @@ behind_proxies: 代理背后的 Express
migrating_4: 迁移到 Express 4
migrating_5: 迁移到 Express 5
database_integration: 数据库集成
-
# API reference
-
api: API 参考
5x: 5.x
4x: 4.x
3x: 3.x (不推荐)
2x: 2.x (不推荐)
-
# Advanced topics
advanced: 高级主题
developing_template_engines: 模板引擎
@@ -40,7 +35,6 @@ security_updates: 安全更新
best_practice_security: 安全最佳实践
best_practice_performance: 性能最佳实践
healthcheck_graceful_shutdown: Health checks & shutdown
-
# Resources
resources: 资源
glossary: 词汇表
@@ -49,10 +43,8 @@ community: 社区
utils: Utility modules
contributing: Contributing to Express
changelog: Release Change Log
-
# Support
support: Support
-
# Blog
blog: Blog
latest_post: Latest post
diff --git a/_data/zh-tw/footer.yml b/_data/zh-tw/footer.yml
index 6d3291d58c..fe92f52ca8 100644
--- a/_data/zh-tw/footer.yml
+++ b/_data/zh-tw/footer.yml
@@ -3,4 +3,4 @@ privacy_policy: Privacy Policy
coc: Code of Conduct
trademark_policy: Trademark Policy
security_policy: Security Policy
-license: License
\ No newline at end of file
+license: License
diff --git a/_data/zh-tw/general.yml b/_data/zh-tw/general.yml
new file mode 100644
index 0000000000..1ed861c663
--- /dev/null
+++ b/_data/zh-tw/general.yml
@@ -0,0 +1,6 @@
+title_announcement: "Express@5.1.0: Now the Default on npm with LTS Timeline"
+body_announcement: "Express 5.1.0 is now the default on npm, and we're introducing an official LTS schedule for the v4 and v5 release lines. Check out our latest blog for more information."
+community-caveat-alert: "This information refers to third-party sites, products, or modules that are not maintained by the Expressjs team. Listing here does not constitute an endorsement or recommendation from the Expressjs project team."
+warning: 'Warning'
+note: 'Note'
+caution: 'Caution'
diff --git a/_data/zh-tw/menu.yml b/_data/zh-tw/menu.yml
index bf2f92add8..14fdb2afa2 100644
--- a/_data/zh-tw/menu.yml
+++ b/_data/zh-tw/menu.yml
@@ -1,6 +1,5 @@
# Home
home: 首頁
-
# Getting started
getting_started: 入門
installing: 安裝
@@ -10,7 +9,6 @@ basic_routing: 基本路由
static_files: 靜態檔案
examples: More examples
faq: 常見問題 (FAQ)
-
# Guide
guide: 手冊
routing: 路由
@@ -24,15 +22,12 @@ behind_proxies: 位於 Proxy 背後的 Express
migrating_4: 移至 Express 4
migrating_5: 移至 Express 5
database_integration: 資料庫整合
-
# API reference
-
api: API 參照
5x: 5.x
4x: 4.x
3x: 3.x 已淘汰
2x: 2.x (已淘汰)
-
# Advanced topics
advanced: 進階主題
developing_template_engines: 範本引擎
@@ -40,7 +35,6 @@ security_updates: 安全更新
best_practice_security: 安全最佳作法
best_practice_performance: 效能最佳作法
healthcheck_graceful_shutdown: Health checks & shutdown
-
# Resources
resources: 資源
glossary: 名詞解釋
@@ -49,10 +43,8 @@ community: 社群
utils: Utility modules
contributing: Contributing to Express
changelog: Release Change Log
-
# Support
support: Support
-
# Blog
blog: Blog
latest_post: Latest post
diff --git a/de/3x/api.md b/de/3x/api.md
old mode 100755
new mode 100644
index 9315550841..de6a67412f
--- a/de/3x/api.md
+++ b/de/3x/api.md
@@ -1,33 +1,26 @@
---
-layout: 3x-api
+layout: api
+version: 3x
title: Express 3.x - API-Referenz
description: Access the API reference for Express.js version 3.x, noting that this version is end-of-life and no longer maintained - includes details on modules and methods.
-menu: api
lang: de
+redirect_from: " "
---
+
**Express 3.x WIRD NICHT MEHR GEWARTET**
- Bekannte und unbekannte Probleme bei Sicherheit und Leistung in 3.x wurden seit dem letzten Update (1. August 2015) noch nicht behoben. Es wird dringend empfohlen, die aktuelle Version von Express zu verwenden.
-
-
-
3.x-API
+Bekannte und unbekannte Probleme bei Sicherheit und Leistung in 3.x wurden seit dem letzten Update (1. August 2015) noch nicht behoben. Es wird dringend empfohlen, die aktuelle Version von Express zu verwenden.
-
- {% include api/en/3x/express.md %}
+If you are unable to upgrade past 3.x, please consider [Commercial Support Options](/{{ page.lang }}/support#commercial-support-options).
-
- {% include api/en/3x/app.md %}
-
-
- {% include api/en/3x/req.md %}
+
-
- {% include api/en/3x/res.md %}
+
3.x-API
-
- {% include api/en/3x/middleware.md %}
+
+{% include api/en/3x/app.md %}
diff --git a/de/4x/api.md b/de/4x/api.md
old mode 100755
new mode 100644
index 736e92231a..495d6d08fe
--- a/de/4x/api.md
+++ b/de/4x/api.md
@@ -1,27 +1,27 @@
---
-layout: 4x-api
+layout: api
+version: 4x
title: Express 4.x - API-Referenz
description: Access the API reference for Express.js 4.x, detailing all modules, methods, and properties for building web applications with this version.
-menu: api
lang: de
+redirect_from: " "
---
+
4.x-API
-
- {% include api/en/4x/express.md %}
+{% capture node-version %}
-
- {% include api/en/4x/app.md %}
+```
+Express 4.0 requires Node.js 0.10 or higher.
+```
-
- {% include api/en/4x/req.md %}
+{% endcapture %}
-
- {% include api/en/4x/res.md %}
+{% include admonitions/note.html content=node-version %}
-
- {% include api/en/4x/router.md %}
+
+{% include api/en/4x/app.md %}
diff --git a/de/5x/api.md b/de/5x/api.md
index d4c783a87c..b0f4528ac6 100644
--- a/de/5x/api.md
+++ b/de/5x/api.md
@@ -1,18 +1,25 @@
---
-layout: 5x-api
+layout: api
+version: 5x
title: Express 5.x - API-Referenz
description: Access the API reference for Express.js 5.x, detailing all modules, methods, and properties for building web applications with this latest version.
-menu: api
lang: de
+redirect_from: " "
---
5.x API
-{% include admonitions/caution.html content="This is early beta documentation that may be incomplete and is still under development." %}
+{% capture node-version %}
-{% include admonitions/note.html content="Express 5.0 requires Node.js 18 or higher." %}
+```
+Express 5.0 requires Node.js 18 or higher.
+```
+
+{% endcapture %}
+
+{% include admonitions/note.html content=node-version %}
{% include api/en/5x/express.md %}
{% include api/en/5x/app.md %}
diff --git a/de/advanced/best-practice-performance.md b/de/advanced/best-practice-performance.md
old mode 100755
new mode 100644
index 559c1ec354..3c638a17ca
--- a/de/advanced/best-practice-performance.md
+++ b/de/advanced/best-practice-performance.md
@@ -4,30 +4,36 @@ title: Leistungsspezifische Best Practices für Express-Anwendungen in Produktio
description: Discover performance and reliability best practices for Express apps in production, covering code optimizations and environment setups for optimal performance.
menu: advanced
lang: de
+redirect_from: " "
---
# Best Practices in Produktionsumgebungen: Leistung und Zuverlässigkeit
-## Überblick
-
In diesem Beitrag werden Best Practices in Bezug auf Leistung und Zuverlässigkeit für Express-Anwendungen behandelt, die in der Produktionsumgebung bereitgestellt werden.
Dieses Thema gehört sicherlich zur "DevOps"-Welt und deckt traditionelle Entwicklungs- und Betriebsprozesse ab. Entsprechend sind die Informationen hier in zwei Teile unterteilt:
-* [Empfehlungen für Maßnahmen an Ihrem Code](#code) (Entwicklung).
-* [Empfehlungen für Maßnahmen an Ihrer Umgebung/Ihrem Setup](#env) (Betrieb).
-
-
-
-## Empfehlungen für Maßnahmen an Ihrem Code
+- Things to do in your code (the dev part):
+ - Für statische Dateien Middleware verwenden
+ - Keine synchronen Funktionen verwenden
+ - [Do logging correctly](#do-logging-correctly)
+ - [Handle exceptions properly](#handle-exceptions-properly)
+- Things to do in your environment / setup (the ops part):
+ - NODE_ENV auf "production" festlegen
+ - Automatischen Neustart Ihrer Anwendung sicherstellen
+ - Anwendung in einem Cluster ausführen
+ - Anforderungsergebnisse im Cache speichern
+ - Load Balancer verwenden
+ - Reverse Proxy verwenden
+
+## Things to do in your code {#in-code}
Dies sind einige Beispiele für Maßnahmen, die Sie an Ihrem Code vornehmen können, um die Anwendungsleistung zu verbessern:
-* GZIP-Komprimierung verwenden
-* Keine synchronen Funktionen verwenden
-* Für statische Dateien Middleware verwenden
-* Auf ordnungsgemäße Protokollierung achten
-* Ausnahmebedingungen ordnungsgemäß handhaben
+- Für statische Dateien Middleware verwenden
+- Keine synchronen Funktionen verwenden
+- [Do logging correctly](#do-logging-correctly)
+- [Handle exceptions properly](#handle-exceptions-properly)
### GZIP-Komprimierung verwenden
@@ -37,6 +43,7 @@ Mit der GZIP-Komprimierung lässt sich die Größe des Antworthauptteils deutlic
const compression = require('compression')
const express = require('express')
const app = express()
+
app.use(compression())
```
@@ -48,19 +55,11 @@ Synchrone Funktionen und Methoden belasten den Ausführungsprozess, bis sie zur
Auch wenn Node und viele andere Module synchrone und asynchrone Versionen ihrer Funktionen bieten, sollten Sie in Produktionsumgebungen immer die asynchrone Version verwenden. Nur beim ersten Systemstart ist die Verwendung einer synchronen Funktion begründet.
-Wenn Sie Node.js 4.0 und höher oder io.js 2.1.0 und höher verwenden, können Sie über das Befehlszeilenflag `--trace-sync-io` eine Warnung und einen Stack-Trace ausgeben, wenn Ihre Anwendung eine synchrone API verwendet. Auch wenn Sie diese natürlich nicht in der Produktionsumgebung verwenden werden, soll dadurch trotzdem sichergestellt werden, dass Ihr Code in der Produktionsumgebung eingesetzt werden kann. Weitere Informationen hierzu siehe [Wöchentliches Update für io.js 2.1.0](https://nodejs.org/en/blog/weekly-updates/weekly-update.2015-05-22/#2-1-0).
-
-### Für statische Dateien Middleware verwenden
-
-Bei der Entwicklung können Sie [res.sendFile()](/{{ page.lang }}/4x/api.html#res.sendFile) für statische Dateien verwenden. Dies gilt jedoch nicht für die Produktionsumgebung, da diese Funktion bei jeder Dateianforderung aus dem Dateisystem lesen muss. Dadurch kommt es zu deutlichen Latenzen, die sich negativ auf die Gesamtleistung der Anwendung auswirken. Beachten Sie, dass `res.sendFile()` *nicht* mit dem Systemaufruf [sendfile](http://linux.die.net/man/2/sendfile) implementiert wird, wodurch dieser deutlich effizienter wäre.
+You can use the `--trace-sync-io` command-line flag to print a warning and a stack trace whenever your application uses a synchronous API. Auch wenn Sie diese natürlich nicht in der Produktionsumgebung verwenden werden, soll dadurch trotzdem sichergestellt werden, dass Ihr Code in der Produktionsumgebung eingesetzt werden kann. Weitere Informationen hierzu siehe [Wöchentliches Update für io.js 2.1.0](https://nodejs.org/en/blog/weekly-updates/weekly-update.2015-05-22/#2-1-0).
-Verwenden Sie stattdessen die Middleware [serve-static](https://www.npmjs.com/package/serve-static) (oder etwas Vergleichbares), die für die Bereitstellung von Dateien für Express-Anwendungen optimiert ist.
+### Do logging correctly
-Die bessere Option wäre, für statische Dateien einen Reverse Proxy zu verwenden. Weitere Informationen siehe [Reverse Proxy verwenden](#proxy).
-
-### Auf ordnungsgemäße Protokollierung achten
-
-Im Allgemeinen gibt es für die Protokollierung Ihrer Anwendung zwei Gründe: 1) Debugging und 2) Protokollierung von Anwendungsaktivitäten (im Wesentlichen alles andere, außer Debugging). Die Verwendung von`console.log()` oder `console.err()` zur Ausgabe von Protokollnachrichten an das Terminal ist in der Entwicklung gängige Praxis. [Diese Funktionen sind jedoch synchron](https://nodejs.org/api/console.html#console_console_1), wenn das Ziel ein Terminal oder eine Datei ist. Sie sind also für Produktionsumgebungen nicht geeignet, es sei denn, Sie leiten die Ausgabe per Pipe zu einem anderen Programm um.
+Im Allgemeinen gibt es für die Protokollierung Ihrer Anwendung zwei Gründe: 1) Debugging und 2) Protokollierung von Anwendungsaktivitäten (im Wesentlichen alles andere, außer Debugging). Die Verwendung von`console.log()` oder `console.err()` zur Ausgabe von Protokollnachrichten an das Terminal ist in der Entwicklung gängige Praxis. But [these functions are synchronous](https://nodejs.org/api/console.html#console) when the destination is a terminal or a file, so they are not suitable for production, unless you pipe the output to another program.
#### Für Debuggingzwecke
@@ -68,43 +67,29 @@ Wenn Sie die Protokollierung für Debuggingzwecke nutzen, sollten Sie statt `con
#### Für Anwendungsaktivitäten
-Wenn Sie Anwendungsaktivitäten protokollieren (z. B. den Datenverkehr oder API-Aufrufe aufzeichnen), sollten Sie statt `console.log()` eine Protokollierungsbibliothek wie [Winston](https://www.npmjs.com/package/winston) oder [Bunyan](https://www.npmjs.com/package/bunyan) verwenden. Einen ausführlichen Vergleich dieser beiden Bibliotheken finden Sie im StrongLoop-Blogbeitrag [Vergleich von Winston und Bunyan für die Node.js-Protokollierung](https://web.archive.org/web/20240000000000/https://strongloop.com/strongblog/compare-node-js-logging-winston-bunyan/).
-
-
+If you're logging app activity (for example, tracking traffic or API calls), instead of using `console.log()`, use a logging library like [Pino](https://www.npmjs.com/package/pino), which is the fastest and most efficient option available.
### Ausnahmebedingungen ordnungsgemäß handhaben
-Node-Anwendungen stürzen ab, wenn eine nicht abgefangene Ausnahmebedingung vorkommt. Wenn diese Ausnahmebedingungen nicht behandelt und entsprechende Maßnahmen eingeleitet werden, stürzt Ihre Express-Anwendung ab und geht offline. Wenn Sie dem nachfolgenden Rat in [Sicherstellen, dass Ihre Anwendung automatisch neu gestartet wird](#restart) folgen, wird Ihre Anwendung nach einem Absturz wiederhergestellt. Glücklicherweise haben Express-Anwendungen nur eine kurze Initialisierungszeit. Nichtsdestotrotz sollten Sie in erster Linie solche Abstürze vermeiden. Und hierzu müssen Sie Ausnahmebedingungen ordnungsgemäß handhaben.
+Node-Anwendungen stürzen ab, wenn eine nicht abgefangene Ausnahmebedingung vorkommt. Wenn diese Ausnahmebedingungen nicht behandelt und entsprechende Maßnahmen eingeleitet werden, stürzt Ihre Express-Anwendung ab und geht offline. Wenn Sie dem nachfolgenden Rat in [Sicherstellen, dass Ihre Anwendung automatisch neu gestartet wird](#restart) folgen, wird Ihre Anwendung nach einem Absturz wiederhergestellt. Glücklicherweise haben Express-Anwendungen nur eine kurze Initialisierungszeit. Nevertheless, you want to avoid crashing in the first place, and to do that, you need to handle exceptions properly.
Mit folgenden Verfahren stellen Sie sicher, dass alle Ausnahmebedingungen gehandhabt werden:
-* ["try-catch" verwenden](#try-catch)
-* ["Promises" verwenden](#promises)
+- ["try-catch" verwenden](#try-catch)
+- ["Promises" verwenden](#promises)
Um näher auf diese Themen eingehen zu können, müssen Sie sich ein grundlegendes Verständnis der Fehlerbehandlung in Node und Express aneignen: Verwendung von Error-first-Callbacks und Propagieren von Fehlern in Middleware. Node verwendet die Konvention "Error-first-Callback" für die Rückgabe von Fehlern von asynchronen Funktionen, bei denen der erste Parameter zur Callback-Funktion das Fehlerobjekt ist, gefolgt von Ergebnisdaten in den nachfolgenden Parametern. Um anzugeben, dass kein Fehler vorliegt, müssen Sie "null" als ersten Parameter übergeben. Die Callback-Funktion muss der Konvention "Error-first-Callback" folgen, um den Fehler sinnvoll bearbeiten zu können. In Express hat sich bewährt, die Funktion "next()" zu verwenden, um Fehler über die Middleware-Chain zu propagieren.
Weitere Informationen zu den Grundlagen der Fehlerbehandlung siehe:
-* [Fehlerbehandlung in Node.js](https://www.tritondatacenter.com/node-js/production/design/errors)
-* [Aufbau leistungsfähiger Node-Anwendungen: Fehlerbehandlung](https://web.archive.org/web/20240000000000/https://strongloop.com/strongblog/robust-node-applications-error-handling/) (StrongLoop-Blog)
-
-#### Was Sie unterlassen sollten
-
-Sie sollten *auf keinen* Fall per Listener das Ereignis `uncaughtException` überwachen, das ausgegeben wird, wenn eine Ausnahmebedingung bis zurück zur Ereignisschleife bestehen bleibt. Durch das Hinzufügen eines Ereignislisteners für `uncaughtException` verändert sich das Standardverhalten des Prozesses, über das eine Ausnahmebedingung festgestellt wird. Der Prozess läuft dann trotz der Ausnahmebedingung weiter. Dies mag sich vielleicht gut anhören, um einem Absturz Ihrer Anwendung vorzubeugen. Das Ausführen einer Anwendung nach einer nicht abgefangenen Ausnahmebedingung ist aber eine durchaus riskante Vorgehensweise und wird nicht empfohlen, da der Prozessstatus störanfällig und unvorhersehbar wird.
-
-Außerdem wird die Verwendung von `uncaughtException` offiziell als [grobes Vorgehen](https://nodejs.org/api/process.html#process_event_uncaughtexception) angesehen, sodass es den [Vorschlag](https://github.com/nodejs/node-v0.x-archive/issues/2582) gibt, die Funktion aus dem Kern zu entfernen. Das Überwachen von `uncaughtException` per Listener ist also keine gute Idee. Daher empfehlen wir Dinge wie Mehrfachprozesse und Supervisoren: Ein Absturz und anschließender Neustart ist häufig die zuverlässigste Art der Fehlerbehebung.
-
-Zudem empfehlen wir, [domains](https://nodejs.org/api/domain.html) nicht zu verwenden. Mit diesem Modul, das zudem veraltet ist, lässt sich das Problem in der Regel nicht lösen.
-
-
+- [Fehlerbehandlung in Node.js](https://www.tritondatacenter.com/node-js/production/design/errors)
#### "try-catch" verwenden
"try-catch" ist ein JavaScript-Sprachkonstrukt, mit dem Sie Ausnahmebedingungen in synchronem Code abfangen können. Verwenden Sie "try-catch" beispielsweise, um JSON-Parsing-Fehler wie unten gezeigt zu bearbeiten.
-Verwenden Sie ein Tool wie [JSHint](http://jshint.com/) oder [JSLint](http://www.jslint.com/), um implizite Ausnahmebedingungen wie [Referenzfehler bei nicht definierten Variablen](http://www.jshint.com/docs/options/#undef) zu finden.
-
-Dies ist ein Beispiel zur Verwendung von "try-catch", um eine potenzielle "process-crashing"-Ausnahmebedingung zu handhaben. Diese Middlewarefunktion akzeptiert einen Abfragefeldparameter mit dem Namen "params", der ein JSON-Objekt ist.
+Dies ist ein Beispiel zur Verwendung von "try-catch", um eine potenzielle "process-crashing"-Ausnahmebedingung zu handhaben.
+Diese Middlewarefunktion akzeptiert einen Abfragefeldparameter mit dem Namen "params", der ein JSON-Objekt ist.
```js
app.get('/search', (req, res) => {
@@ -123,85 +108,70 @@ app.get('/search', (req, res) => {
"try-catch" funktioniert jedoch nur in synchronem Code. Da die Node-Plattform primär asynchron ist (insbesondere in einer Produktionsumgebung), lassen sich mit "try-catch" nicht besonders viele Ausnahmebedingungen abfangen.
-
-
#### "Promises" verwenden
-Mit "Promises" werden alle Ausnahmebedingungen (explizite und implizite) in asynchronen Codeblöcken gehandhabt, die `then()` verwenden. Sie müssen nur `.catch(next)` am Ende der Promises-Ketten hinzufügen. Beispiel:
+When an error is thrown in an `async` function or a rejected promise is awaited inside an `async` function, those errors will be passed to the error handler as if calling `next(err)`
```js
-app.get('/', (req, res, next) => {
- // do some sync stuff
- queryDb()
- .then((data) => makeCsv(data)) // handle data
- .then((csv) => { /* handle csv */ })
- .catch(next)
+app.get('/', async (req, res, next) => {
+ const data = await userData() // If this promise fails, it will automatically call `next(err)` to handle the error.
+
+ res.send(data)
})
app.use((err, req, res, next) => {
- // handle error
+ res.status(err.status ?? 500).send({ error: err.message })
})
```
-Jetzt werden alle asynchronen und synchronen Fehler zur Middleware "error" propagiert.
-
-Es gibt jedoch zwei Vorbehalte:
-
-1. Der gesamte asynchrone Code muss "Promises" zurückgeben (außer Emitter). Wenn eine bestimmte Bibliothek keine "Promises" zurückgibt, müssen Sie das Basisobjekt mit einer Helper-Funktion wie [Bluebird.promisifyAll()](http://bluebirdjs.com/docs/api/promise.promisifyall.html) konvertieren.
-2. Ereignisemitter (wie Streams) können nach wie vor nicht abgefangene Ausnahmebedingungen verursachen. Sie müssen also sicherstellen, dass Sie das Fehlerereignis ordnungsgemäß handhaben. Beispiel:
+Also, you can use asynchronous functions for your middleware, and the router will handle errors if the promise fails, for example:
```js
-const wrap = fn => (...args) => fn(...args).catch(args[2])
+app.use(async (req, res, next) => {
+ req.locals.user = await getUser(req)
-app.get('/', wrap(async (req, res, next) => {
- const company = await getCompanyById(req.query.id)
- const stream = getLogoStreamById(company.id)
- stream.on('error', next).pipe(res)
-}))
+ next() // This will be called if the promise does not throw an error.
+})
```
-Weitere Informationen zur Fehlerbehandlung mithilfe von "Promises" siehe:
+Best practice is to handle errors as close to the site as possible. So while this is now handled in the router, it’s best to catch the error in the middleware and handle it without relying on separate error-handling middleware.
-* [Asynchrone Fehlerbehandlung in Express mit "Promises", Generatoren und ES7](https://web.archive.org/web/20240000000000/https://strongloop.com/strongblog/async-error-handling-expressjs-es7-promises-generators/)
-* ["Promises" in Node.js mit Q – eine Alternative zu Callbacks](https://web.archive.org/web/20240000000000/https://strongloop.com/strongblog/promises-in-node-js-with-q-an-alternative-to-callbacks/)
+#### What not to do
-
+Sie sollten _auf keinen_ Fall per Listener das Ereignis `uncaughtException` überwachen, das ausgegeben wird, wenn eine Ausnahmebedingung bis zurück zur Ereignisschleife bestehen bleibt. Durch das Hinzufügen eines Ereignislisteners für `uncaughtException` verändert sich das Standardverhalten des Prozesses, über das eine Ausnahmebedingung festgestellt wird. Das Ausführen einer Anwendung nach einer nicht abgefangenen Ausnahmebedingung ist aber eine durchaus riskante Vorgehensweise und wird nicht empfohlen, da der Prozessstatus störanfällig und unvorhersehbar wird.
-## Empfehlungen für Maßnahmen an Ihrer Umgebung/Ihrem Setup
+Außerdem wird die Verwendung von `uncaughtException` offiziell als [grobes Vorgehen](https://nodejs.org/api/process.html#process_event_uncaughtexception) angesehen, sodass es den [Vorschlag](https://github.com/nodejs/node-v0.x-archive/issues/2582) gibt, die Funktion aus dem Kern zu entfernen. Das Überwachen von `uncaughtException` per Listener ist also keine gute Idee. Daher empfehlen wir Dinge wie Mehrfachprozesse und Supervisoren: Ein Absturz und anschließender Neustart ist häufig die zuverlässigste Art der Fehlerbehebung.
-Dies sind einige Beispiele für Maßnahmen, die Sie an Ihrer Systemumgebung vornehmen können, um die Anwendungsleistung zu verbessern:
+Zudem empfehlen wir, [domains](https://nodejs.org/api/domain.html) nicht zu verwenden. Mit diesem Modul, das zudem veraltet ist, lässt sich das Problem in der Regel nicht lösen.
-* NODE_ENV auf "production" festlegen
-* Automatischen Neustart Ihrer Anwendung sicherstellen
-* Anwendung in einem Cluster ausführen
-* Anforderungsergebnisse im Cache speichern
-* Load Balancer verwenden
-* Reverse Proxy verwenden
+## Things to do in your environment / setup
-### NODE_ENV auf "production" festlegen
+{#in-environment}
-In der Umgebungsvariablen NODE_ENV wird die Umgebung angegeben, in der eine Anwendung ausgeführt wird (in der Regel ist dies die Entwicklungs- oder Produktionsumgebung). Am einfachsten lässt sich die Leistung verbessern, indem NODE_ENV auf "production" festgelegt wird.
+Dies sind einige Beispiele für Maßnahmen, die Sie an Ihrer Systemumgebung vornehmen können, um die Anwendungsleistung zu verbessern:
-Durch das Festlegen von NODE_ENV auf "production" führt Express Folgendes aus:
+- NODE_ENV auf "production" festlegen
+- Automatischen Neustart Ihrer Anwendung sicherstellen
+- Anwendung in einem Cluster ausführen
+- Anforderungsergebnisse im Cache speichern
+- Load Balancer verwenden
+- Reverse Proxy verwenden
-* Speichern von Anzeigevorlagen im Cache.
-* Speichern von CSS-Dateien, die aus CSS-Erweiterungen generiert wurden, im Cache.
-* Generieren von weniger ausführlichen Fehlernachrichten.
+### NODE_ENV auf "production" festlegen
-[Tests deuten darauf hin](http://apmblog.dynatrace.com/2015/07/22/the-drastic-effects-of-omitting-node_env-in-your-express-js-applications/), dass alleine dadurch die Anwendungsleistung um den Faktor 3 verbessert werden kann!
+In der Umgebungsvariablen NODE_ENV wird die Umgebung angegeben, in der eine Anwendung ausgeführt wird (in der Regel ist dies die Entwicklungs- oder Produktionsumgebung). One of the simplest things you can do to improve performance is to set NODE_ENV to `production`.
-Wenn Sie umgebungsspezifischen Code schreiben müssen, können Sie den Wert von NODE_ENV mit `process.env.NODE_ENV` überprüfen. Beachten Sie, dass die Überprüfung des Werts seiner Umgebungsvariablen eine leistungsbezogene Penalisierung nach sich zieht. Sie sollten also sehr sparsam damit umgehen.
+Durch das Festlegen von NODE_ENV auf "production" führt Express Folgendes aus:
-In einer Entwicklungsumgebung wird die Umgebungsvariable in der Regel in Ihrer interaktiven Shell festgelegt, indem Sie beispielsweise `export` oder Ihre Datei `.bash_profile` verwenden. Im Allgemeinen sollten Sie dies nicht auf dem Produktionsserver vornehmen. Verwenden Sie stattdessen das Init-System (systemd oder Upstart) Ihres Betriebssystems. Der nächste Abschnitt enthält weitere Details zur Verwendung des Init-Systems im Allgemeinen. Die Festlegung von NODE_ENV ist jedoch für das Leistungsverhalten so wichtig (und so einfach durchzuführen), dass hier besonders darauf eingegangen wird.
+- Speichern von Anzeigevorlagen im Cache.
+- Speichern von CSS-Dateien, die aus CSS-Erweiterungen generiert wurden, im Cache.
+- Generieren von weniger ausführlichen Fehlernachrichten.
-Verwenden Sie bei Upstart das Schlüsselwort `env` in Ihrer Jobdatei. Beispiel:
+[Tests indicate](https://www.dynatrace.com/news/blog/the-drastic-effects-of-omitting-node-env-in-your-express-js-applications/) that just doing this can improve app performance by a factor of three!
-```sh
-# /etc/init/env.conf
- env NODE_ENV=production
-```
+Wenn Sie umgebungsspezifischen Code schreiben müssen, können Sie den Wert von NODE_ENV mit `process.env.NODE_ENV` überprüfen. Beachten Sie, dass die Überprüfung des Werts seiner Umgebungsvariablen eine leistungsbezogene Penalisierung nach sich zieht.
-Weitere Informationen hierzu siehe [Upstart Intro, Cookbook and Best Practices](http://upstart.ubuntu.com/cookbook/#environment-variables).
+In einer Entwicklungsumgebung wird die Umgebungsvariable in der Regel in Ihrer interaktiven Shell festgelegt, indem Sie beispielsweise `export` oder Ihre Datei `.bash_profile` verwenden. But in general, you shouldn't do that on a production server; instead, use your OS's init system (systemd). Der nächste Abschnitt enthält weitere Details zur Verwendung des Init-Systems im Allgemeinen. Die Festlegung von NODE_ENV ist jedoch für das Leistungsverhalten so wichtig (und so einfach durchzuführen), dass hier besonders darauf eingegangen wird.
Verwenden Sie bei systemd die Anweisung `Environment` in Ihrer Einheitendatei. Beispiel:
@@ -210,16 +180,14 @@ Verwenden Sie bei systemd die Anweisung `Environment` in Ihrer Einheitendatei. B
Environment=NODE_ENV=production
```
-Weitere Informationen siehe [Umgebungsvariablen in systemd-Einheiten verwenden](https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html).
-
-Wenn Sie StrongLoop Process Manager verwenden, können Sie auch die [Umgebungsvariable festlegen, wenn Sie StrongLoop Process Manager als Service installieren](https://docs.strongloop.com/display/SLC/Setting+up+a+production+host#Settingupaproductionhost-Setenvironmentvariables).
+For more information, see [Using Environment Variables In systemd Units](https://www.flatcar.org/docs/latest/setup/systemd/environment-variables/).
### Automatischen Neustart Ihrer Anwendung sicherstellen
In der Produktionsumgebung sollte die Anwendung nie offline sein. Das bedeutet, dass Sie sicherstellen müssen, dass die Anwendung bei einem Absturz der Anwendung oder des Servers immer wieder neu gestartet wird. Auch wenn man hofft, das keines dieser Ereignisse jemals eintritt, muss man doch mit beiden Möglichkeiten rechnen und:
-* einen Prozessmanager verwenden, um die Anwendung (und Node) bei einem Absturz neu zu starten.
-* das Init-System Ihres Betriebssystems verwenden, um den Prozessmanager bei einem Absturz des Betriebssystems neu zu starten. Außerdem kann das Init-System auch ohne einen Prozessmanager verwendet werden.
+- einen Prozessmanager verwenden, um die Anwendung (und Node) bei einem Absturz neu zu starten.
+- das Init-System Ihres Betriebssystems verwenden, um den Prozessmanager bei einem Absturz des Betriebssystems neu zu starten. Außerdem kann das Init-System auch ohne einen Prozessmanager verwendet werden.
Node-Anwendungen stürzen ab, wenn eine nicht abgefangene Ausnahmebedingung auftritt. Als Erstes müssen Sie in einem solchen Fall sicherstellen, dass Ihre Anwendung ausreichend getestet wurde und in der Lage ist, alle Ausnahmebedingungen zu handhaben (weitere Informationen siehe [Ausnahmebedingungen ordnungsgemäß handhaben](#exceptions)). Die sicherste Maßnahme ist jedoch, einen Mechanismus zu implementieren, über den bei einem Absturz der Anwendung ein automatischer Neustart der Anwendung ausgeführt wird.
@@ -229,54 +197,35 @@ In Entwicklungumgebungen wird die Anwendung einfach über die Befehlszeile mit `
Neben einem Neustart der Anwendung nach einem Absturz bietet ein Prozessmanager noch weitere Möglichkeiten:
-* Einblicke in die Laufzeitleistung und die Ressourcennutzung
-* Dynamische Änderung der Einstellungen zur Verbesserung des Leistungsverhaltens
-* Steuerung des Clustering (StrongLoop PM und PM2)
+- Einblicke in die Laufzeitleistung und die Ressourcennutzung
+- Dynamische Änderung der Einstellungen zur Verbesserung des Leistungsverhaltens
+- Control clustering (pm2).
-Die gängigsten Prozessmanager für Node sind:
-
-* [StrongLoop Process Manager](http://strong-pm.io/)
-* [PM2](https://github.com/Unitech/pm2)
-* [Forever](https://www.npmjs.com/package/forever)
-
-Einen Vergleich der Features und Funktionen dieser Prozessmanager finden Sie hier: [http://strong-pm.io/compare/](http://strong-pm.io/compare/).
-
-Die Verwendung eines dieser Prozessmanager reicht aus, um Ihre Anwendung betriebsbereit zu halten, selbst wenn sie hin und wieder abstürzt.
-
-StrongLoop PM verfügt jedoch über zahlreiche Features und Funktionen, die sich speziell auf Implementierungen in der Produktionsumgebung beziehen. Sie können diesen Prozessmanager und die zugehörigen StrongLoop-Tools für folgende Zwecke verwenden:
-
-* Lokales Erstellen und Packen Ihrer Anwendung mit anschließender sicherer Bereitstellung auf Ihrem Produktionssystem
-* Automatischer Neustart Ihrer Anwendung nach einem Absturz aus irgendeinem Grund
-* Verwaltung Ihrer Cluster über Fernzugriff
-* Anzeige von CPU-Profilen und Heapspeichermomentaufnahmen (Heap-Snapshots) zur Optimierung der Leistung und Diagnose von Speicherlecks
-* Anzeige von Leistungsmessdaten für Ihre Anwendung
-* Einfache Skalierung auf mehrere Hosts mit integrierter Steuerung für Nginx Load Balancer
-
-Wie unten beschrieben, erfolgt ein automatischer Neustart beim Systemwiederanlauf, wenn Sie StrongLoop Process Manager über Ihr Init-System als Betriebssystemservice installieren. Dadurch bleiben Ihre Anwendungsprozesse und Cluster dauerhaft betriebsbereit.
+Historically, it was popular to use a Node.js process manager like [PM2](https://github.com/Unitech/pm2). See their documentation if you wish to do this. However, we recommend using your init system for process management.
#### Init-System verwenden
-Als nächste Ebene der Zuverlässigkeit müssen Sie sicherstellen, dass Ihre Anwendung bei einem Serverneustart neu gestartet wird. Systeme können immer wieder aus verschiedenen Gründen abstürzen. Um sicherzustellen, dass Ihre Anwendung bei einem Serverabsturz neu gestartet wird, können Sie das in Ihr Betriebssystem integrierte Init-System verwenden. Die beiden wichtigsten Init-Systeme sind aktuell [systemd](https://wiki.debian.org/systemd) und [Upstart](http://upstart.ubuntu.com/).
+Als nächste Ebene der Zuverlässigkeit müssen Sie sicherstellen, dass Ihre Anwendung bei einem Serverneustart neu gestartet wird. Systeme können immer wieder aus verschiedenen Gründen abstürzen. Um sicherzustellen, dass Ihre Anwendung bei einem Serverabsturz neu gestartet wird, können Sie das in Ihr Betriebssystem integrierte Init-System verwenden. The main init system in use today is [systemd](https://wiki.debian.org/systemd).
Es gibt zwei Möglichkeiten, Init-Systeme mit Ihrer Express-Anwendung zu verwenden:
-* Ausführung Ihrer Anwendung in einem Prozessmanager und Installation des Prozessmanagers als Service mit dem Init-System. Der Prozessmanager wird neu gestartet, wenn Ihre Anwendung abstürzt. Das Init-System startet dann den Prozessmanager neu, sobald das Betriebssystem neu gestartet wird. Dies ist die empfohlene Vorgehensweise.
-* Ausführung Ihrer Anwendung (und von Node) direkt mit dem Init-System. Diese Vorgehensweise ist zwar etwas einfacher, Sie profitieren jedoch nicht von den zusätzlichen Vorteilen des Einsatzes eines Prozessmanagers.
+- Ausführung Ihrer Anwendung in einem Prozessmanager und Installation des Prozessmanagers als Service mit dem Init-System. Der Prozessmanager wird neu gestartet, wenn Ihre Anwendung abstürzt. Dies ist die empfohlene Vorgehensweise.
+- Ausführung Ihrer Anwendung (und von Node) direkt mit dem Init-System. Diese Vorgehensweise ist zwar etwas einfacher, Sie profitieren jedoch nicht von den zusätzlichen Vorteilen des Einsatzes eines Prozessmanagers.
##### systemd
"systemd" ist ein Linux-System und Service-Manager. Die meisten wichtigen Linux-Distributionen haben "systemd" als Init-Standardsystem übernommen.
-Eine "systemd"-Servicekonfigurationsdatei wird als *Einheitendatei* bezeichnet, die die Endung ".service" hat. Dies ist ein Beispiel für eine Einheitendatei zur direkten Verwaltung einer Node-Anwendung (ersetzen Sie den Text in Fettdruck durch Werte für Ihr System und Ihre Anwendung):
+Eine "systemd"-Servicekonfigurationsdatei wird als _Einheitendatei_ bezeichnet, die die Endung ".service" hat. Dies ist ein Beispiel für eine Einheitendatei zur direkten Verwaltung einer Node-Anwendung (ersetzen Sie den Text in Fettdruck durch Werte für Ihr System und Ihre Anwendung): Replace the values enclosed in `` for your system and app:
```sh
[Unit]
-Description=Awesome Express App
+Description=
[Service]
Type=simple
-ExecStart=/usr/local/bin/node /projects/myapp/index.js
-WorkingDirectory=/projects/myapp
+ExecStart=/usr/local/bin/node
+WorkingDirectory=
User=nobody
Group=nogroup
@@ -298,143 +247,67 @@ Restart=always
[Install]
WantedBy=multi-user.target
```
-Weitere Informationen zu "systemd" siehe [systemd-Referenz (Man-Page)](http://www.freedesktop.org/software/systemd/man/systemd.unit.html).
-##### StrongLoop Process Manager als "systemd"-Service
-
-Sie können StrongLoop Process Manager problemlos als "systemd"-Service installieren. Dadurch wird beim Serverneustart StrongLoop Process Manager automatisch neu gestartet. Dadurch wiederum werden alle Anwendungen neu gestartet, die von diesem Prozessmanager verwaltet werden.
-
-So installieren Sie StrongLoop Process Manager als "systemd"-Service:
-
-```bash
-$ sudo sl-pm-install --systemd
-```
-
-Starten Sie dann den Service mit:
-
-```bash
-$ sudo /usr/bin/systemctl start strong-pm
-```
-
-Weitere Informationen hierzu finden Sie im Thema [Produktionshost einrichten (in der StrongLoop-Dokumentation)](https://docs.strongloop.com/display/SLC/Setting+up+a+production+host#Settingupaproductionhost-RHEL7+,Ubuntu15.04or15.10).
-
-##### Upstart
-
-"Upstart" ist ein Systemtool, das auf vielen Linux-Distributionen verfügbar ist. Mit diesem Tool können Aufgaben (Tasks) und Services beim Systemstart gestartet, beim Herunterfahren gestoppt und auch überwacht werden. Sie können Ihre Express-Anwendung oder einen Prozessmanager als Service konfigurieren. "Upstart" startet diese dann bei einem Absturz automatisch neu.
-
-Ein "Upstart"-Service wird als Jobkonfigurationsdatei (auch als "Job" bezeichnet) definiert, deren Dateiname mit `.conf` endet. Das folgende Beispiel zeigt, wie ein Job namens "myapp" für eine Anwendung namens "myapp" erstellt wird, wobei sich die Hauptdatei im Verzeichnis `/projects/myapp/index.js` befindet.
-
-Erstellen Sie eine Datei namens `myapp.conf` unter `/etc/init/` mit dem folgenden Inhalt (ersetzen Sie den Text in Fettdruck durch Werte für Ihr System und Ihre Anwendung):
-```sh
-# When to start the process
-start on runlevel [2345]
-
-# When to stop the process
-stop on runlevel [016]
-
-# Increase file descriptor limit to be able to handle more requests
-limit nofile 50000 50000
-
-# Use production mode
-env NODE_ENV=production
-
-# Run as www-data
-setuid www-data
-setgid www-data
-
-# Run from inside the app dir
-chdir /projects/myapp
-
-# The process to start
-exec /usr/local/bin/node /projects/myapp/index.js
-
-# Restart the process if it is down
-respawn
+Weitere Informationen zu "systemd" siehe [systemd-Referenz (Man-Page)](http://www.freedesktop.org/software/systemd/man/systemd.unit.html).
-# Limit restart attempt to 10 times within 10 seconds
-respawn limit 10 10
-```
+### Anwendung in einem Cluster ausführen
-Hinweis: Dieses Script erfordert Upstart 1.4 oder höher mit Unterstützung auf Ubuntu 12.04-14.10.
+In einem Multi-Core-System können Sie die Leistung einer Node-Anwendung mehrmals erhöhen, indem Sie einen Cluster von Prozessen starten. Ein Cluster führt mehrere Instanzen der Anwendung aus, idealerweise eine Instanz auf jedem CPU-Core.
-Da der Job so konfiguriert ist, dass er beim Systemstart ausgeführt wird, wird Ihre Anwendung zusammen mit dem Betriebssystem gestartet und automatisch neu gestartet, wenn die Anwendung abstürzt oder das System heruntergefahren wird.
+
-Neben dem automatischen Neustart der Anwendung können Sie mit Upstart die folgenden Befehle verwenden:
+Wichtig. Da die Anwendungsinstanzen als separate Prozesse ausgeführt werden, nutzen sie nicht dieselbe Hauptspeicherkapazität gemeinsam. Das heißt, Objekte befinden sich für jede Instanz der Anwendung auf lokaler Ebene. Daher kann der Status im Anwendungscode nicht beibehalten werden. Sie können jedoch einen speicherinternen Datenspeicher wie [Redis](http://redis.io/) verwenden, um sitzungsrelevante Daten und Statusinformationen zu speichern. Diese Einschränkung trifft im Wesentlichen auf alle Formen der horizontalen Skalierung zu, unabhängig davon, ob es sich um Clustering mit mehreren Prozessen oder mehreren physischen Servern handelt.
-* `start myapp` – Anwendung starten
-* `restart myapp` – Anwendung neu starten
-* `stop myapp` – Anwendung stoppen
+Bei in Gruppen zusammengefassten Anwendungen (geclusterte Anwendungen) können Verarbeitungsprozesse einzeln ausfallen, ohne dass sich dies auf die restlichen Prozesse auswirkt. Neben den Leistungsvorteilen ist die Fehlerisolierung ein weiterer Grund, einen Cluster von Anwendungsprozessen auszuführen. Wenn ein Verarbeitungsprozess abstürzt, müssen Sie sicherstellen, dass das Ereignis protokolliert und ein neuer Prozess mithilfe von "cluster.fork()" gestartet wird.
-Weitere Informationen zu "Upstart" siehe [Upstart Intro, Cookbook and Best Practises](http://upstart.ubuntu.com/cookbook).
+#### Clustermodule von Node verwenden
-##### StrongLoop Process Manager als "Upstart"-Service
+Clustering is made possible with Node's [cluster module](https://nodejs.org/api/cluster.html). Dadurch wird ein Masterprozess eingeleitet, um Verarbeitungsprozesse zu starten und eingehende Verbindungen auf die Verarbeitungsprozesse zu verteilen.
-Sie können StrongLoop Process Manager problemlos als "Upstart"-Service installieren. Dadurch wird beim Serverneustart StrongLoop Process Manager automatisch neu gestartet. Dadurch wiederum werden alle Anwendungen neu gestartet, die von diesem Prozessmanager verwaltet werden.
+#### Using PM2
-So installieren Sie StrongLoop Process Manager als "Upstart 1.4"-Service:
+If you deploy your application with PM2, then you can take advantage of clustering _without_ modifying your application code. You should ensure your [application is stateless](https://pm2.keymetrics.io/docs/usage/specifics/#stateless-apps) first, meaning no local data is stored in the process (such as sessions, websocket connections and the like).
-```bash
-$ sudo sl-pm-install
-```
+When running an application with PM2, you can enable **cluster mode** to run it in a cluster with a number of instances of your choosing, such as the matching the number of available CPUs on the machine. You can manually change the number of processes in the cluster using the `pm2` command line tool without stopping the app.
-Fühen Sie dann den Service aus mit:
+To enable cluster mode, start your application like so:
```bash
-$ sudo /sbin/initctl start strong-pm
+# Start 4 worker processes
+$ pm2 start npm --name my-app -i 4 -- start
+# Auto-detect number of available CPUs and start that many worker processes
+$ pm2 start npm --name my-app -i max -- start
```
-Hinweis: Auf Systemen, die Upstart 1.4 nicht unterstützen, sind die Befehle leicht unterschiedlich. Weitere Informationen hierzu siehe das
-Thema [Einrichtung eines Produktionshosts (in der StrongLoop-Dokumentation)](https://docs.strongloop.com/display/SLC/Setting+up+a+production+host#Settingupaproductionhost-RHELLinux5and6,Ubuntu10.04-.10,11.04-.10).
+This can also be configured within a PM2 process file (`ecosystem.config.js` or similar) by setting `exec_mode` to `cluster` and `instances` to the number of workers to start.
-### Anwendung in einem Cluster ausführen
-
-In einem Multi-Core-System können Sie die Leistung einer Node-Anwendung mehrmals erhöhen, indem Sie einen Cluster von Prozessen starten. Ein Cluster führt mehrere Instanzen der Anwendung aus, idealerweise eine Instanz auf jedem CPU-Core. Dadurch werden die Arbeitslasten und die Tasks auf die Instanzen verteilt.
-
-
-
-Wichtig. Da die Anwendungsinstanzen als separate Prozesse ausgeführt werden, nutzen sie nicht dieselbe Hauptspeicherkapazität gemeinsam. Das heißt, Objekte befinden sich für jede Instanz der Anwendung auf lokaler Ebene. Daher kann der Status im Anwendungscode nicht beibehalten werden. Sie können jedoch einen speicherinternen Datenspeicher wie [Redis](http://redis.io/) verwenden, um sitzungsrelevante Daten und Statusinformationen zu speichern. Diese Einschränkung trifft im Wesentlichen auf alle Formen der horizontalen Skalierung zu, unabhängig davon, ob es sich um Clustering mit mehreren Prozessen oder mehreren physischen Servern handelt.
-
-Bei in Gruppen zusammengefassten Anwendungen (geclusterte Anwendungen) können Verarbeitungsprozesse einzeln ausfallen, ohne dass sich dies auf die restlichen Prozesse auswirkt. Neben den Leistungsvorteilen ist die Fehlerisolierung ein weiterer Grund, einen Cluster von Anwendungsprozessen auszuführen. Wenn ein Verarbeitungsprozess abstürzt, müssen Sie sicherstellen, dass das Ereignis protokolliert und ein neuer Prozess mithilfe von "cluster.fork()" gestartet wird.
-
-#### Clustermodule von Node verwenden
-
-Das Clustering erfolgt über das [Clustermodul](https://nodejs.org/docs/latest/api/cluster.html) von Node. Dadurch wird ein Masterprozess eingeleitet, um Verarbeitungsprozesse zu starten und eingehende Verbindungen auf die Verarbeitungsprozesse zu verteilen. Anstatt dieses Modul jedoch direkt zu verwenden, ist es deutlich besser, eines der vielen angebotenen Tools einzusetzen, das diesen Vorgang automatisch für Sie ausführt, wie beispielsweise [node-pm](https://www.npmjs.com/package/node-pm) oder [cluster-service](https://www.npmjs.com/package/cluster-service).
-
-#### StrongLoop Process Manager verwenden
-
-Wenn Sie Ihre Anwendung auf StrongLoop Process Manager (PM) bereitstellen, können Sie die Vorteile des Clustering nutzen, *ohne* Ihren Anwendungscode ändern zu müssen.
-
-Wenn StrongLoop Process Manager (PM) eine Anwendung ausführt, wird diese automatisch in einem Cluster ausgeführt. Die Anzahl der Verarbeitungsprozesse entspricht dabei der Anzahl der CPU-Cores im System. Sie können die Anzahl der Verarbeitungsprozesse manuell im Cluster ändern. Hierfür verwenden Sie das Befehlszeilentool "slc", ohne die Anwendung stoppen zu müssen.
-
-Beispiel: Angenommen, Sie haben Ihre Anwendung auf prod.foo.com bereitgestellt, und StrongLoop PM ist auf Port 8701 (Standardport) empfangsbereit. Dann müssen Sie die Clustergröße mithilfe von "slc" auf "8" einstellen.
+Once running, the application can be scaled like so:
```bash
-$ slc ctl -C http://prod.foo.com:8701 set-size my-app 8
+# Add 3 more workers
+$ pm2 scale my-app +3
+# Scale to a specific number of workers
+$ pm2 scale my-app 2
```
-Weitere Informationen zum Clustering mit StrongLoop PM finden Sie im Thema [Clustering](https://docs.strongloop.com/display/SLC/Clustering) in der StrongLoop-Dokumentation.
+For more information on clustering with PM2, see [Cluster Mode](https://pm2.keymetrics.io/docs/usage/cluster-mode/) in the PM2 documentation.
### Anforderungsergebnisse im Cache speichern
Eine weitere Strategie zur Verbesserung des Leistungsverhaltens in Produktionsumgebungen ist das Speichern von Anforderungergebnissen im Cache. Ihre Anwendung muss also diese Operation nicht wiederholt ausführen, um dieselbe Anforderung wiederholt zu bedienen.
-Mithilfe eines Caching-Servers wie [Varnish](https://www.varnish-cache.org/) oder [Nginx](https://www.nginx.com/resources/wiki/start/topics/examples/reverseproxycachingexample/) (siehe auch [Nginx Caching](https://serversforhackers.com/nginx-caching/)) lassen sich Geschwindigkeit und Leistung Ihrer Anwendung hervorragend verbessern.
+Use a caching server like [Varnish](https://www.varnish-cache.org/) or [Nginx](https://blog.nginx.org/blog/nginx-caching-guide) (see also [Nginx Caching](https://serversforhackers.com/nginx-caching/)) to greatly improve the speed and performance of your app.
### Load Balancer verwenden
-Unabhängig davon, wie gut eine Anwendung optimiert wurde, kann eine Einzelinstanz nur eine begrenzte Arbeitslast oder einen begrenzten Datenverkehr handhaben. Eine Möglichkeit, eine Anwendung zu skalieren, ist die Ausführung mehrerer Instanzen dieser Anwendung und die Verteilung des Datenverkehrs über eine Lastausgleichsfunktion (Load Balancer) vorzunehmen. Die Einrichtung eines solchen Load Balancer kann helfen, Leistung und Geschwindigkeit Ihrer Anwendung zu verbessern. Zudem lässt sich dadurch die Anwendung besser skalieren als mit einer Einzelinstanz.
-
-Ein Load Balancer ist in der Regel ein Reverse Proxy, der den Datenverkehr zu und von mehreren Anwendungsinstanzen und Servern koordiniert. Sie können ohne großen Aufwand einen Load Balancer für Ihre Anwendung einrichten. Verwenden Sie hierzu [Nginx](http://nginx.org/en/docs/http/load_balancing.html) oder [HAProxy](https://www.digitalocean.com/community/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts).
-
-Bei einer solchen Lastverteilung müssen Sie sicherstellen, dass Anforderungen, die einer bestimmten Sitzungs-ID zugeordnet sind, mit dem Prozess verbunden sind, von dem sie ursprünglich stammen. Dies wird auch als *Sitzungsaffinität* oder *Affine Sitzungen* bezeichnet und kann durch den obigen Vorschlag, einen Datenspeicher wie Redis für Sitzungsdaten zu verwenden (je nach Anwendung), umgesetzt werden. Eine Beschreibung hierzu siehe [Mehrere Knoten verwenden](https://socket.io/docs/v4/using-multiple-nodes/).
+Unabhängig davon, wie gut eine Anwendung optimiert wurde, kann eine Einzelinstanz nur eine begrenzte Arbeitslast oder einen begrenzten Datenverkehr handhaben. Eine Möglichkeit, eine Anwendung zu skalieren, ist die Ausführung mehrerer Instanzen dieser Anwendung und die Verteilung des Datenverkehrs über eine Lastausgleichsfunktion (Load Balancer) vorzunehmen. Die Einrichtung eines solchen Load Balancer kann helfen, Leistung und Geschwindigkeit Ihrer Anwendung zu verbessern.
-#### StrongLoop Process Manager mit einem Nginx Load Balancer verwenden
+Ein Load Balancer ist in der Regel ein Reverse Proxy, der den Datenverkehr zu und von mehreren Anwendungsinstanzen und Servern koordiniert. You can easily set up a load balancer for your app by using [Nginx](https://nginx.org/en/docs/http/load_balancing.html) or [HAProxy](https://www.digitalocean.com/community/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts).
-[StrongLoop Process Manager](http://strong-pm.io/) lässt sich in einen Nginx-Controller integrieren und erleichtert dadurch das Konfigurieren von Produktionsumgebungen mit mehreren Hosts. Weitere Informationen finden Sie im Thema zum [Skalieren auf mehrere Server](https://docs.strongloop.com/display/SLC/Scaling+to+multiple+servers) (in der StrongLoop-Dokumentation).
-
+Bei einer solchen Lastverteilung müssen Sie sicherstellen, dass Anforderungen, die einer bestimmten Sitzungs-ID zugeordnet sind, mit dem Prozess verbunden sind, von dem sie ursprünglich stammen. Dies wird auch als _Sitzungsaffinität_ oder _Affine Sitzungen_ bezeichnet und kann durch den obigen Vorschlag, einen Datenspeicher wie Redis für Sitzungsdaten zu verwenden (je nach Anwendung), umgesetzt werden. Eine Beschreibung hierzu siehe [Mehrere Knoten verwenden](https://socket.io/docs/v4/using-multiple-nodes/).
### Reverse Proxy verwenden
-Ein Reverse Proxy befindet sich vor einer Webanwendung und führt Unterstützungsoperationen für die Anforderungen aus (außer das Weiterleiten von Anforderungen an die Anwendung). Er kann u. a. Fehlerseiten, Komprimierungen und Caching bearbeiten, Dateien bereitstellen und Lastverteilungen vornehmen.
+Ein Reverse Proxy befindet sich vor einer Webanwendung und führt Unterstützungsoperationen für die Anforderungen aus (außer das Weiterleiten von Anforderungen an die Anwendung). Fehlerseiten, Komprimierungen und Caching bearbeiten, Dateien bereitstellen und Lastverteilungen vornehmen.
-Durch die Übergabe von Tasks, die keine Kenntnis des Anwendungsstatus erfordern, an einen Reverse Proxy muss Express keine speziellen Anwendungstasks mehr ausführen. Aus diesem Grund wird empfohlen, in Produktionsumgebungen Express hinter einem Reverse Proxy wie [Nginx](https://www.nginx.com/) oder [HAProxy](http://www.haproxy.org/) auszuführen.
+Durch die Übergabe von Tasks, die keine Kenntnis des Anwendungsstatus erfordern, an einen Reverse Proxy muss Express keine speziellen Anwendungstasks mehr ausführen. For this reason, it is recommended to run Express behind a reverse proxy like [Nginx](https://www.nginx.org/) or [HAProxy](https://www.haproxy.org/) in production.
diff --git a/de/advanced/best-practice-security.md b/de/advanced/best-practice-security.md
old mode 100755
new mode 100644
index db0a1c2efb..54ca976e7d
--- a/de/advanced/best-practice-security.md
+++ b/de/advanced/best-practice-security.md
@@ -4,18 +4,44 @@ title: Sicherheitsspezifische Best Practices für Express-Anwendungen in Produkt
description: Discover crucial security best practices for Express apps in production, including using TLS, input validation, secure cookies, and preventing vulnerabilities.
menu: advanced
lang: de
+redirect_from: " "
---
# Best Practices in Produktionsumgebungen: Sicherheit
## Überblick
-Der Begriff *"Produktion"* bezieht sich auf die Phase im Softwarelebenszyklus, in der eine Anwendung oder API für Endbenutzer oder Verbraucher allgemein verfügbar ist. Im Gegensatz dazu wird in der Phase *"Entwicklung"* noch aktiv Code geschrieben und getestet. Die Anwendung ist in dieser Phase noch nicht für externen Zugriff verfügbar. Die entsprechenden Systemumgebungen werden als *Produktionsumgebungen* und *Entwicklungsumgebungen* bezeichnet.
+Der Begriff _"Produktion"_ bezieht sich auf die Phase im Softwarelebenszyklus, in der eine Anwendung oder API für Endbenutzer oder Verbraucher allgemein verfügbar ist. Im Gegensatz dazu wird in der Phase _"Entwicklung"_ noch aktiv Code geschrieben und getestet. Die Anwendung ist in dieser Phase noch nicht für externen Zugriff verfügbar. Die entsprechenden Systemumgebungen werden als _Produktionsumgebungen_ und _Entwicklungsumgebungen_ bezeichnet.
Entwicklungs- und Produktionsumgebungen werden in der Regel unterschiedlich konfiguriert und weisen deutliche Unterschiede bei den Anforderungen auf. Was in der Entwicklung funktioniert, muss in der Produktion nicht unbedingt akzeptabel sein. Beispiel: In einer Entwicklungsumgebung ist eine ausführliche Protokollierung von Fehlern für Debuggingzwecke sinnvoll. Dieselbe Vorgehensweise kann in einer Produktionsumgebung jedoch zu einem Sicherheitsproblem führen. In einer Entwicklungsumgebung müssen Sie sich keine Gedanken zu Themen wie Skalierbarkeit, Zuverlässigkeit und Leistung machen, während dies in einer Produktionsumgebung kritische Faktoren sind.
+{% capture security-note %}
+
+If you believe you have discovered a security vulnerability in Express, please see
+[Security Policies and Procedures](/en/resources/contributing.html#security-policies-and-procedures).
+
+{% endcapture %}
+
+{% include admonitions/note.html content=security-note %}
+
In diesem Beitrag werden einige der Best Practices in Bezug auf das Thema Sicherheit für Express-Anwendungen behandelt, die in der Produktionsumgebung bereitgestellt werden.
+- [Production Best Practices: Security](#production-best-practices-security)
+ - [Overview](#overview)
+ - [Don't use deprecated or vulnerable versions of Express](#dont-use-deprecated-or-vulnerable-versions-of-express)
+ - Über [hsts](https://github.com/helmetjs/hsts) werden `Strict-Transport-Security`-Header festgelegt, über die sichere (HTTP over SSL/TLS) Verbindungen zum Server durchgesetzt werden.
+ - [Do not trust user input](#do-not-trust-user-input)
+ - [Prevent open redirects](#prevent-open-redirects)
+ - "Helmet" ist eine Ansammlung von neun kleineren Middlewarefunktionen, über die sicherheitsrelevante HTTP-Header festgelegt werden.
+ - [Reduce fingerprinting](#reduce-fingerprinting)
+ - Über [xssFilter](https://github.com/helmetjs/x-xss-protection) werden `X-XSS-Protection`-Header festgelegt, um XSS-Filter (Cross-site Scripting) in den meisten aktuellen Web-Browsern zu aktivieren.
+ - Über [noCache](https://github.com/helmetjs/nocache) werden `Cache-Control`- und Pragma-Header festgelegt, um clientseitiges Caching zu deaktivieren.
+ - Über [ieNoOpen](https://github.com/helmetjs/ienoopen) werden `X-Download-Options`-Header für IE8+ festgelegt.
+ - [Prevent brute-force attacks against authorization](#prevent-brute-force-attacks-against-authorization)
+ - [Ensure your dependencies are secure](#ensure-your-dependencies-are-secure)
+ - [Avoid other known vulnerabilities](#avoid-other-known-vulnerabilities)
+ - [Additional considerations](#additional-considerations)
+
## Verwenden Sie keine veralteten oder anfälligen Versionen von Express
Express 2.x und 3.x werden nicht mehr gepflegt. Sicherheits- und Leistungsprobleme in diesen Versionen werden nicht mehr behoben. Verwenden Sie diese Versionen nicht! Wenn Sie noch nicht auf Version 4 umgestellt haben, befolgen Sie die Anweisungen im [Migrationshandbuch](/{{ page.lang }}/guide/migrating-4.html).
@@ -26,45 +52,83 @@ Stellen Sie außerdem sicher, dass Sie keine anfälligen Express-Versionen verwe
Wenn über Ihre Anwendung vertrauliche Daten bearbeitet oder übertragen werden, sollten Sie [Transport Layer Security](https://en.wikipedia.org/wiki/Transport_Layer_Security) (TLS) verwenden, um die Verbindung und die Daten zu schützen. Diese Technologie verschlüsselt Daten, bevor sie vom Client zum Server gesendet werden. Dadurch lassen sich einige gängige (und einfache) Hackerattacken vermeiden. Auch wenn Ajax- und POST-Anforderungen nicht sofort offensichtlich und in Browsern "versteckt" zu sein scheinen, ist deren Netzverkehr anfällig für das [Ausspionieren von Paketen](https://en.wikipedia.org/wiki/Packet_analyzer) und [Man-in-the-Middle-Attacken](https://en.wikipedia.org/wiki/Man-in-the-middle_attack).
-Möglicherweise sind Sie mit SSL-Verschlüsselung (Secure Socket Layer) bereits vertraut. [TLS ist einfach der nächste Entwicklungsschritt bei SSL](https://msdn.microsoft.com/en-us/library/windows/desktop/aa380515(v=vs.85).aspx). In anderen Worten: Wenn Sie bisher SSL verwendet haben, sollten Sie ein Upgrade auf TLS in Erwägung ziehen. Generell empfehlen wir für TLS den Nginx-Server. Eine gute Referenz zum Konfigurieren von TLS auf Nginx (und anderen Servern) ist [Empfohlene Serverkonfigurationen (Mozilla Wiki)](https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_Server_Configurations).
+Möglicherweise sind Sie mit SSL-Verschlüsselung (Secure Socket Layer) bereits vertraut. [TLS ist einfach der nächste Entwicklungsschritt bei SSL](https://msdn.microsoft.com/en-us/library/windows/desktop/aa380515\(v=vs.85\).aspx). In anderen Worten: Wenn Sie bisher SSL verwendet haben, sollten Sie ein Upgrade auf TLS in Erwägung ziehen. Generell empfehlen wir für TLS den Nginx-Server. Eine gute Referenz zum Konfigurieren von TLS auf Nginx (und anderen Servern) ist [Empfohlene Serverkonfigurationen (Mozilla Wiki)](https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_Server_Configurations).
Ein handliches Tool zum Abrufen eines kostenloses TLS-Zertifikats ist außerdem [Let's Encrypt](https://letsencrypt.org/about/), eine kostenlose, automatisierte und offene Zertifizierungsstelle der [Internet Security Research Group (ISRG)](https://letsencrypt.org/isrg/).
+## Do not trust user input
+
+For web applications, one of the most critical security requirements is proper user input validation and handling. This comes in many forms and we will not cover all of them here.
+Ultimately, the responsibility for validating and correctly handling the types of user input your application accepts is yours.
+
+### Prevent open redirects
+
+An example of potentially dangerous user input is an _open redirect_, where an application accepts a URL as user input (often in the URL query, for example `?url=https://example.com`) and uses `res.redirect` to set the `location` header and
+return a 3xx status.
+
+An application must validate that it supports redirecting to the incoming URL to avoid sending users to malicious links such as phishing websites, among other risks.
+
+Here is an example of checking URLs before using `res.redirect` or `res.location`:
+
+```js
+app.use((req, res) => {
+ try {
+ if (new Url(req.query.url).host !== 'example.com') {
+ return res.status(400).end(`Unsupported redirect to host: ${req.query.url}`)
+ }
+ } catch (e) {
+ return res.status(400).end(`Invalid url: ${req.query.url}`)
+ }
+ res.redirect(req.query.url)
+})
+```
+
## "Helmet" verwenden
[Helmet](https://www.npmjs.com/package/helmet) kann beim Schutz Ihrer Anwendung gegen einige gängige Schwachstellen hilfreiche Dienste leisten, indem die HTTP-Header entsprechend konfiguriert werden.
-"Helmet" ist eine Ansammlung von neun kleineren Middlewarefunktionen, über die sicherheitsrelevante HTTP-Header festgelegt werden.
+Helmet is a middleware function that sets security-related HTTP response headers. Helmet sets the following headers by default:
-* Über [csp](https://github.com/helmetjs/csp) wird der `Content-Security-Policy`-Header festgelegt, um Cross-Site Scripting-Attacken und anderen standortübergreifenden Injektionen vorzubeugen.
-* Über [hidePoweredBy](https://github.com/helmetjs/hide-powered-by) wird der `X-Powered-By`-Header entfernt.
-* Über [hsts](https://github.com/helmetjs/hsts) werden `Strict-Transport-Security`-Header festgelegt, über die sichere (HTTP over SSL/TLS) Verbindungen zum Server durchgesetzt werden.
-* Über [ieNoOpen](https://github.com/helmetjs/ienoopen) werden `X-Download-Options`-Header für IE8+ festgelegt.
-* Über [noCache](https://github.com/helmetjs/nocache) werden `Cache-Control`- und Pragma-Header festgelegt, um clientseitiges Caching zu deaktivieren.
-* Über [noSniff](https://github.com/helmetjs/dont-sniff-mimetype) werden `X-Content-Type-Options`-Header festgelegt, um bei Browsern MIME-Sniffing von Antworten weg vom deklarierten Inhaltstyp (declared content-type) vorzubeugen.
-* Über [frameguard](https://github.com/helmetjs/frameguard) wird der `X-Frame-Options`-Header festgelegt, um [Clickjacking](https://www.owasp.org/index.php/Clickjacking)-Schutz zu gewährleisten.
-* Über [xssFilter](https://github.com/helmetjs/x-xss-protection) werden `X-XSS-Protection`-Header festgelegt, um XSS-Filter (Cross-site Scripting) in den meisten aktuellen Web-Browsern zu aktivieren.
+- `Content-Security-Policy`: A powerful allow-list of what can happen on your page which mitigates many attacks
+- `Cross-Origin-Opener-Policy`: Helps process-isolate your page
+- `Cross-Origin-Resource-Policy`: Blocks others from loading your resources cross-origin
+- `Origin-Agent-Cluster`: Changes process isolation to be origin-based
+- `Referrer-Policy`: Controls the [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer) header
+- `Strict-Transport-Security`: Tells browsers to prefer HTTPS
+- `X-Content-Type-Options`: Avoids [MIME sniffing](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#mime_sniffing)
+- `X-DNS-Prefetch-Control`: Controls DNS prefetching
+- `X-Download-Options`: Forces downloads to be saved (Internet Explorer only)
+- `X-Frame-Options`: Legacy header that mitigates [Clickjacking](https://en.wikipedia.org/wiki/Clickjacking) attacks
+- `X-Permitted-Cross-Domain-Policies`: Controls cross-domain behavior for Adobe products, like Acrobat
+- `X-Powered-By`: Info about the web server. Removed because it could be used in simple attacks
+- `X-XSS-Protection`: Legacy header that tries to mitigate [XSS attacks](https://developer.mozilla.org/en-US/docs/Glossary/Cross-site_scripting), but makes things worse, so Helmet disables it
+
+Each header can be configured or disabled. To read more about it please go to [its documentation website][helmet].
Installieren Sie "Helmet" wie alle anderen Module:
```bash
-$ npm install --save helmet
+$ npm install helmet
```
So verwenden Sie "Helmet" in Ihrem Code:
```js
-/// ...
+// ...
const helmet = require('helmet')
app.use(helmet())
-/// ...
+// ...
```
-### Deaktivieren Sie mindestens den X-Powered-By-Header
+## Reduce fingerprinting
-Wenn Sie "Helmet" nicht verwenden wollen, sollten Sie mindestens den `X-Powered-By`-Header deaktivieren. Angreifer können diesen Header (der standardmäßig aktiviert ist) zum Erkennen von Anwendungen mit Express verwenden und dann gezielte Attacken in die Wege leiten.
+It can help to provide an extra layer of security to reduce the ability of attackers to determine
+the software that a server uses, known as "fingerprinting." Though not a security issue itself,
+reducing the ability to fingerprint an application improves its overall security posture.
+Server software can be fingerprinted by quirks in how it responds to specific requests, for example in
+the HTTP response headers.
Ein bewährtes Verfahren ist also, diesen Header mit der Methode `app.disable()` zu deaktivieren:
@@ -72,7 +136,37 @@ Ein bewährtes Verfahren ist also, diesen Header mit der Methode `app.disable()`
app.disable('x-powered-by')
```
-Wenn Sie `helmet.js` verwenden, kümmert sich das Tool darum.
+{% capture powered-advisory %}
+
+Disabling the `X-Powered-By header` does not prevent
+a sophisticated attacker from determining that an app is running Express. It may
+discourage a casual exploit, but there are other ways to determine an app is running
+Express.
+
+{% endcapture %}
+
+{% include admonitions/note.html content=powered-advisory %}
+
+Express also sends its own formatted "404 Not Found" messages and formatter error
+response messages. These can be changed by
+[adding your own not found handler](/en/starter/faq.html#how-do-i-handle-404-responses)
+and
+[writing your own error handler](/en/guide/error-handling.html#writing-error-handlers):
+
+```js
+// last app.use calls right before app.listen():
+
+// custom 404
+app.use((req, res, next) => {
+ res.status(404).send("Sorry can't find that!")
+})
+
+// custom error handler
+app.use((err, req, res, next) => {
+ console.error(err.stack)
+ res.status(500).send('Something broke!')
+})
+```
## Cookies sicher verwenden
@@ -80,8 +174,8 @@ Um sicherzustellen, dass Cookies Ihre Anwendung nicht für Angriffsmöglichkeite
Es gibt zwei wesentliche Middleware-Cookie-Sitzungsmodule:
-* [express-session](https://www.npmjs.com/package/express-session), das in Express 3.x integrierte `express.session`-Middleware ersetzt.
-* [cookie-session](https://www.npmjs.com/package/cookie-session), das in Express 3.x integrierte `express.cookieSession`-Middleware ersetzt.
+- [express-session](https://www.npmjs.com/package/express-session), das in Express 3.x integrierte `express.session`-Middleware ersetzt.
+- [cookie-session](https://www.npmjs.com/package/cookie-session), das in Express 3.x integrierte `express.cookieSession`-Middleware ersetzt.
Der Hauptunterschied zwischen diesen beiden Modulen liegt darin, wie die Cookie-Sitzungsdaten gespeichert werden. Die [express-session](https://www.npmjs.com/package/express-session)-Middleware speichert Sitzungsdaten auf dem Server. Sie speichert nur die Sitzungs-ID im Cookie und nicht die Sitzungsdaten. Standardmäßig wird dabei der speicherinterne Speicher verwendet. Eine Verwendung der Middleware in der Produktionsumgebung ist nicht vorgesehen. In der Produktionsumgebung müssen Sie einen skalierbaren "Session-Store" einrichten. Siehe hierzu die Liste der [kompatiblen Session-Stores](https://github.com/expressjs/session#compatible-session-stores).
@@ -91,7 +185,7 @@ Im Gegensatz dazu implementiert die [cookie-session](https://www.npmjs.com/packa
Die Verwendung des standardmäßigen Namens des Sitzungscookies kann Ihre Anwendung anfällig für Attacken machen. Das mögliche Sicherheitsproblem ist vergleichbar mit `X-Powered-By`: ein potenzieller Angreifer kann diesen Header verwenden, um einen elektronischen Fingerabdruck des Servers zu erstellen und Attacken entsprechend zu platzieren.
-Dieses Problem lässt sich vermeiden, wenn Sie allgemeine Cookienamen verwenden; z. B. durch Verwendung der [express-session](https://www.npmjs.com/package/express-session)-Middleware:
+Über [noSniff](https://github.com/helmetjs/dont-sniff-mimetype) werden `X-Content-Type-Options`-Header festgelegt, um bei Browsern MIME-Sniffing von Antworten weg vom deklarierten Inhaltstyp (declared content-type) vorzubeugen.
```js
const session = require('express-session')
@@ -99,19 +193,18 @@ app.set('trust proxy', 1) // trust first proxy
app.use(session({
secret: 's3Cur3',
name: 'sessionId'
-})
-)
+}))
```
### Cookie-Sicherheitsoptionen festlegen
Legen Sie die folgenden Cookieoptionen fest, um die Sicherheit zu erhöhen:
-* `secure` - Stellt sicher, dass der Browser das Cookie nur über HTTPS sendet.
-* `httpOnly` - Stellt sicher, dass das Cookie nur über HTTP(S) und nicht über das Client-JavaScript gesendet wird und dadurch Schutz gegen Cross-Site Scripting-Attacken besteht.
-* `domain` - Gibt die Domäne des Cookies an, die für den Vergleich mit der Domäne des Servers verwendet wird, in der die URL angefordert wird. Stimmen diese beiden überein, müssen Sie das Pfadattribut überprüfen.
-* `path` - Gibt den Pfad des Cookies an, der für den Vergleich mit dem Anforderungspfad verwendet wird. Wenn dieser Pfad und die Domäne übereinstimmen, können Sie das Cookie in der Anforderung senden.
-* `expires` - Wird verwendet, um das Ablaufdatum für persistente Cookies festzulegen.
+- `secure` - Stellt sicher, dass der Browser das Cookie nur über HTTPS sendet.
+- `httpOnly` - Stellt sicher, dass das Cookie nur über HTTP(S) und nicht über das Client-JavaScript gesendet wird und dadurch Schutz gegen Cross-Site Scripting-Attacken besteht.
+- `domain` - Gibt die Domäne des Cookies an, die für den Vergleich mit der Domäne des Servers verwendet wird, in der die URL angefordert wird. Stimmen diese beiden überein, müssen Sie das Pfadattribut überprüfen.
+- `path` - Gibt den Pfad des Cookies an, der für den Vergleich mit dem Anforderungspfad verwendet wird. Wenn dieser Pfad und die Domäne übereinstimmen, können Sie das Cookie in der Anforderung senden.
+- `expires` - Wird verwendet, um das Ablaufdatum für persistente Cookies festzulegen.
Dies ist ein Beispiel zur Verwendung der [cookie-session](https://www.npmjs.com/package/cookie-session)-Middleware:
@@ -131,23 +224,59 @@ app.use(session({
path: 'foo/bar',
expires: expiryDate
}
-})
-)
+}))
```
-## Weitere Überlegungen
+## Prevent brute-force attacks against authorization
+
+Make sure login endpoints are protected to make private data more secure.
+
+A simple and powerful technique is to block authorization attempts using two metrics:
+
+1. The number of consecutive failed attempts by the same user name and IP address.
+2. The number of failed attempts from an IP address over some long period of time. For example, block an IP address if it makes 100 failed attempts in one day.
+
+[rate-limiter-flexible](https://github.com/animir/node-rate-limiter-flexible) package provides tools to make this technique easy and fast. You can find [an example of brute-force protection in the documentation](https://github.com/animir/node-rate-limiter-flexible/wiki/Overall-example#login-endpoint-protection)
+
+## Ensure your dependencies are secure
+
+Using npm to manage your application's dependencies is powerful and convenient. But the packages that you use may contain critical security vulnerabilities that could also affect your application. The security of your app is only as strong as the "weakest link" in your dependencies.
+
+Since npm@6, npm automatically reviews every install request. Also, you can use `npm audit` to analyze your dependency tree.
+
+```bash
+$ npm audit
+```
+
+If you want to stay more secure, consider [Snyk](https://snyk.io/).
-Dies sind einige weitere Empfehlungen aus der hervorragenden [Node.js Security Checklist](https://blog.risingstack.com/node-js-security-checklist/). In diesem Blogbeitrag finden Sie alle Details zu diesen Empfehlungen:
+Snyk offers both a [command-line tool](https://www.npmjs.com/package/snyk) and a [Github integration](https://snyk.io/docs/github) that checks your application against [Snyk's open source vulnerability database](https://snyk.io/vuln/) for any known vulnerabilities in your dependencies. Install the CLI as follows:
-* Implementieren Sie Rate-Limiting, um Brute-Force-Attacken gegen Authentifizierungen zu verhindern. Hierfür können Sie beispielsweise das [StrongLoop API Gateway](https://web.archive.org/web/20240000000000/https://strongloop.com/node-js/api-gateway/) verwenden, um eine Rate-Limiting-Richtlinie durchzusetzen. Alternativ können Sie eine Middleware wie [express-limiter](https://www.npmjs.com/package/express-limiter) verwenden. Hierzu müssen Sie jedoch Ihren Code etwas modifizieren.
-* Filtern und bereinigen Sie immer Benutzereingaben, um sich gegen XS-Angriffe (Cross-Site Scripting) und Befehlsinjektionsattacken zu schützen.
-* Implementieren Sie Verteidungsmaßnahmen gegen SQL-Injection-Attacken, indem sie parametrisierte Abfragen oder vorbereitete Anweisungen einsetzen.
-* Nutzen Sie das Open-Source-Tool [sqlmap](http://sqlmap.org/), um SQL-Injection-Schwachstellen in Ihrer Anwendung zu erkennen.
-* Verwenden Sie die Tools [nmap](https://nmap.org/) und [sslyze](https://github.com/nabla-c0d3/sslyze), um die Konfiguration Ihrer SSL-Verschlüsselungen, -Schlüssel und Neuvereinbarungen sowie die Gültigkeit Ihres Zertifikats zu testen.
-* Verwenden Sie [safe-regex](https://www.npmjs.com/package/safe-regex), um sicherzustellen, dass Ihre regulären Ausdrücke nicht für [Denial-of-Service-Attacken](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS) anfällig sind.
+```bash
+$ npm install -g snyk
+$ cd your-app
+```
-## Vermeiden Sie andere Schwachstellen
+Use this command to test your application for vulnerabilities:
+
+```bash
+$ snyk test
+```
+
+### Vermeiden Sie andere Schwachstellen
Achten Sie auf [Node Security Project](https://npmjs.com/advisories)-Empfehlungen, die Express oder andere Module, die Ihre Anwendung nutzt, beeinträchtigen können. Im Allgemeinen ist Node Security Project aber eine exzellente Ressource mit Wissen und Tools zur Sicherheit von Node.
Letztendlich können Express-Anwendungen – wie viele andere Webanwendungen auch – anfällig für eine Vielzahl webbasierter Attacken sein. Machen Sie sich deshalb mit bekannten [webspezifischen Schwachstellen](https://www.owasp.org/www-project-top-ten/) vertraut und treffen Sie die geeigneten Vorkehrungen, um diese zu vermeiden.
+
+## Weitere Überlegungen
+
+Dies sind einige weitere Empfehlungen aus der hervorragenden [Node.js Security Checklist](https://blog.risingstack.com/node-js-security-checklist/). In diesem Blogbeitrag finden Sie alle Details zu diesen Empfehlungen:
+
+- Filtern und bereinigen Sie immer Benutzereingaben, um sich gegen XS-Angriffe (Cross-Site Scripting) und Befehlsinjektionsattacken zu schützen.
+- Implementieren Sie Verteidungsmaßnahmen gegen SQL-Injection-Attacken, indem sie parametrisierte Abfragen oder vorbereitete Anweisungen einsetzen.
+- Nutzen Sie das Open-Source-Tool [sqlmap](http://sqlmap.org/), um SQL-Injection-Schwachstellen in Ihrer Anwendung zu erkennen.
+- Verwenden Sie die Tools [nmap](https://nmap.org/) und [sslyze](https://github.com/nabla-c0d3/sslyze), um die Konfiguration Ihrer SSL-Verschlüsselungen, -Schlüssel und Neuvereinbarungen sowie die Gültigkeit Ihres Zertifikats zu testen.
+- Verwenden Sie [safe-regex](https://www.npmjs.com/package/safe-regex), um sicherzustellen, dass Ihre regulären Ausdrücke nicht für [Denial-of-Service-Attacken](https://www.owasp.org/index.php/Regular_expression_Denial_of_Service_-_ReDoS) anfällig sind.
+
+[helmet]:
\ No newline at end of file
diff --git a/de/advanced/developing-template-engines.md b/de/advanced/developing-template-engines.md
old mode 100755
new mode 100644
index 309e2d1b66..dd42f55a90
--- a/de/advanced/developing-template-engines.md
+++ b/de/advanced/developing-template-engines.md
@@ -4,6 +4,7 @@ title: Template-Engines für Express entwickeln
description: Learn how to develop custom template engines for Express.js using app.engine(), with examples on creating and integrating your own template rendering logic.
menu: advanced
lang: de
+redirect_from: " "
---
# Template-Engines für Express entwickeln
@@ -16,9 +17,10 @@ Der folgende Code ist ein Beispiel für die Implementierung einer sehr einfachen
const fs = require('fs') // this engine requires the fs module
app.engine('ntl', (filePath, options, callback) => { // define the template engine
fs.readFile(filePath, (err, content) => {
- if (err) return callback(new Error(err))
+ if (err) return callback(err)
// this is an extremely simple template engine
- const rendered = content.toString().replace('#title#', `${options.title}`)
+ const rendered = content.toString()
+ .replace('#title#', `${options.title}`)
.replace('#message#', `
${options.message}
`)
return callback(null, rendered)
})
@@ -33,10 +35,13 @@ Ihre Anwendung ist jetzt in der Lage, `.ntl`-Dateien auszugeben. Erstellen Sie i
#title#
#message#
```
+
Erstellen Sie dann in Ihrer Anwendung die folgende Route.
+
```js
app.get('/', (req, res) => {
res.render('index', { title: 'Hey', message: 'Hello there!' })
})
```
-Wenn Sie eine Anforderung zur Homepage einleiten, wird `index.ntl` im HTML-Format ausgegeben.
+
+Wenn Sie eine Anforderung zur Homepage einleiten, wird `index.ntl` im HTML-Format ausgegeben.
\ No newline at end of file
diff --git a/de/advanced/healthcheck-graceful-shutdown.md b/de/advanced/healthcheck-graceful-shutdown.md
new file mode 100644
index 0000000000..34085a504f
--- /dev/null
+++ b/de/advanced/healthcheck-graceful-shutdown.md
@@ -0,0 +1,34 @@
+---
+layout: page
+title: Health Checks and Graceful Shutdown
+description: Learn how to implement health checks and graceful shutdown in Express apps to enhance reliability, manage deployments, and integrate with load balancers like Kubernetes.
+menu: advanced
+lang: de
+redirect_from: " "
+---
+
+# Health Checks and Graceful Shutdown
+
+## Graceful shutdown
+
+When you deploy a new version of your application, you must replace the previous version. The process manager you're using will first send a SIGTERM signal to the application to notify it that it will be killed. Once the application gets this signal, it should stop accepting new requests, finish all the ongoing requests, clean up the resources it used, including database connections and file locks then exit.
+
+### Beispiel
+
+```js
+const server = app.listen(port)
+
+process.on('SIGTERM', () => {
+ debug('SIGTERM signal received: closing HTTP server')
+ server.close(() => {
+ debug('HTTP server closed')
+ })
+})
+```
+
+## Health checks
+
+A load balancer uses health checks to determine if an application instance is healthy and can accept requests. For example, [Kubernetes has two health checks](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/):
+
+- `liveness`, that determines when to restart a container.
+- `readiness`, that determines when a container is ready to start accepting traffic. When a pod is not ready, it is removed from the service load balancers.
\ No newline at end of file
diff --git a/de/advanced/security-updates.md b/de/advanced/security-updates.md
old mode 100755
new mode 100644
index ec7bab2ba3..3b573ae521
--- a/de/advanced/security-updates.md
+++ b/de/advanced/security-updates.md
@@ -4,6 +4,7 @@ title: Express-Sicherheitsupdates
description: Review the latest security updates and patches for Express.js, including detailed vulnerability lists for different versions to help maintain a secure application.
menu: advanced
lang: de
+redirect_from: " "
---
# Sicherheitsupdates
@@ -15,32 +16,73 @@ Schwachstellen bei Node.js wirken sich direkt auf Express aus. Daher sollten Sie
Die folgende Liste enthält die Express-Schwachstellen, die im angegebenen Versionsupdate behoben wurden.
+{% capture security-policy %}
+If you believe you have discovered a security vulnerability in Express, please see
+[Security Policies and Procedures](/{{page.lang}}/resources/contributing.html#security-policies-and-procedures).
+{% endcapture %}
+
+{% include admonitions/note.html content=security-policy %}
+
## 4.x
- * 4.11.1
- * Offenlegungsgefahr beim Rootpfad in `express.static`, `res.sendfile` und `res.sendFile` behoben.
- * 4.10.7
- * Offene Umadressierungsschwachstelle in `express.static` ([Empfehlung](https://npmjs.com/advisories/35), [CVE-2015-1164](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-1164)) behoben.
- * 4.8.8
- * Schwachstellen durch Directory-Traversal-Technik in `express.static` ([Empfehlung](http://npmjs.com/advisories/32) , [CVE-2014-6394](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6394)) behoben.
- * 4.8.4
- * Node.js 0.10 kann in bestimmten Situationen Lecks bei `fd` aufweisen, die sich auf `express.static` und `res.sendfile` auswirken. Böswillige Anforderungen können zu Lecks bei `fd` führen und letztendlich `EMFILE`-Fehler nach sich ziehen und bewirken, dass Server nicht antworten.
- * 4.8.0
- * Sparse-Arrays mit extrem hohen Indizes in der Abfragezeichenfolge können bewirken, dass für die Prozessausführung nicht genügend Arbeitsspeicher zur Verfügung steht und es zu einem Serverabsturz kommt.
- * Extrem verschachtelte Abfragezeichenfolgenobjekte können bewirken, dass der Prozess blockiert und der Server dadurch vorübergehend nicht antwortet.
+- 4.21.2
+ - The dependency `path-to-regexp` has been updated to address a [vulnerability](https://github.com/pillarjs/path-to-regexp/security/advisories/GHSA-rhx6-c78j-4q9w).
+- 4.21.1
+ - The dependency `cookie` has been updated to address a [vulnerability](https://github.com/jshttp/cookie/security/advisories/GHSA-pxg6-pf52-xh8x), This may affect your application if you use `res.cookie`.
+- 4.20.0
+ - Fixed XSS vulnerability in `res.redirect` ([advisory](https://github.com/expressjs/express/security/advisories/GHSA-qw6h-vgh9-j6wx), [CVE-2024-43796](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-43796)).
+ - The dependency `serve-static` has been updated to address a [vulnerability](https://github.com/advisories/GHSA-cm22-4g7w-348p).
+ - The dependency `send` has been updated to address a [vulnerability](https://github.com/advisories/GHSA-m6fv-jmcg-4jfg).
+ - The dependency `path-to-regexp` has been updated to address a [vulnerability](https://github.com/pillarjs/path-to-regexp/security/advisories/GHSA-9wv6-86v2-598j).
+ - The dependency `body-parser` has been updated to addres a [vulnerability](https://github.com/advisories/GHSA-qwcr-r2fm-qrc7), This may affect your application if you had url enconding activated.
+- 4.19.0, 4.19.1
+ - Fixed open redirect vulnerability in `res.location` and `res.redirect` ([advisory](https://github.com/expressjs/express/security/advisories/GHSA-rv95-896h-c2vc), [CVE-2024-29041](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-29041)).
+- 4.17.3
+ - The dependency `qs` has been updated to address a [vulnerability](https://github.com/advisories/GHSA-hrpp-h998-j3pp). This may affect your application if the following APIs are used: `req.query`, `req.body`, `req.param`.
+- 4.16.0
+ - The dependency `forwarded` has been updated to address a [vulnerability](https://npmjs.com/advisories/527). This may affect your application if the following APIs are used: `req.host`, `req.hostname`, `req.ip`, `req.ips`, `req.protocol`.
+ - The dependency `mime` has been updated to address a [vulnerability](https://npmjs.com/advisories/535), but this issue does not impact Express.
+ - The dependency `send` has been updated to provide a protection against a [Node.js 8.5.0 vulnerability](https://nodejs.org/en/blog/vulnerability/september-2017-path-validation/). This only impacts running Express on the specific Node.js version 8.5.0.
+- 4.15.5
+ - The dependency `debug` has been updated to address a [vulnerability](https://snyk.io/vuln/npm:debug:20170905), but this issue does not impact Express.
+ - The dependency `fresh` has been updated to address a [vulnerability](https://npmjs.com/advisories/526). This will affect your application if the following APIs are used: `express.static`, `req.fresh`, `res.json`, `res.jsonp`, `res.send`, `res.sendfile` `res.sendFile`, `res.sendStatus`.
+- 4.15.3
+ - The dependency `ms` has been updated to address a [vulnerability](https://snyk.io/vuln/npm:ms:20170412). This may affect your application if untrusted string input is passed to the `maxAge` option in the following APIs: `express.static`, `res.sendfile`, and `res.sendFile`.
+- 4.15.2
+ - The dependency `qs` has been updated to address a [vulnerability](https://snyk.io/vuln/npm:qs:20170213), but this issue does not impact Express. Updating to 4.15.2 is a good practice, but not required to address the vulnerability.
+- 4.11.1
+ - Offenlegungsgefahr beim Rootpfad in `express.static`, `res.sendfile` und `res.sendFile` behoben.
+- 4.10.7
+ - Offene Umadressierungsschwachstelle in `express.static` ([Empfehlung](https://npmjs.com/advisories/35), [CVE-2015-1164](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-1164)) behoben.
+- 4.8.8
+ - Schwachstellen durch Directory-Traversal-Technik in `express.static` ([Empfehlung](http://npmjs.com/advisories/32) , [CVE-2014-6394](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6394)) behoben.
+- 4.8.4
+ - Node.js 0.10 kann in bestimmten Situationen Lecks bei `fd` aufweisen, die sich auf `express.static` und `res.sendfile` auswirken. Böswillige Anforderungen können zu Lecks bei `fd` führen und letztendlich `EMFILE`-Fehler nach sich ziehen und bewirken, dass Server nicht antworten.
+- 4.8.0
+ - Sparse-Arrays mit extrem hohen Indizes in der Abfragezeichenfolge können bewirken, dass für die Prozessausführung nicht genügend Arbeitsspeicher zur Verfügung steht und es zu einem Serverabsturz kommt.
+ - Extrem verschachtelte Abfragezeichenfolgenobjekte können bewirken, dass der Prozess blockiert und der Server dadurch vorübergehend nicht antwortet.
## 3.x
- * 3.19.1
- * Offenlegungsgefahr beim Rootpfad in `express.static`, `res.sendfile` und `res.sendFile` behoben.
- * 3.19.0
- * Offene Umadressierungsschwachstelle in `express.static` ([Empfehlung](https://npmjs.com/advisories/35), [CVE-2015-1164](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-1164)) behoben.
- * 3.16.10
- * Schwachstellen durch Directory-Traversal-Technik in `express.static` behoben.
- * 3.16.6
- * Node.js 0.10 kann in bestimmten Situationen Lecks bei `fd` aufweisen, die sich auf `express.static` und `res.sendfile` auswirken. Böswillige Anforderungen können zu Lecks bei `fd` führen und letztendlich `EMFILE`-Fehler nach sich ziehen und bewirken, dass Server nicht antworten.
- * 3.16.0
- * Sparse-Arrays mit extrem hohen Indizes in der Abfragezeichenfolge können bewirken, dass für die Prozessausführung nicht genügend Arbeitsspeicher zur Verfügung steht und es zu einem Serverabsturz kommt.
- * Extrem verschachtelte Abfragezeichenfolgenobjekte können bewirken, dass der Prozess blockiert und der Server dadurch vorübergehend nicht antwortet.
- * 3.3.0
- * Die Antwort 404 bei einem nicht unterstützten Überschreibungsversuch war anfällig gegen Cross-Site Scripting-Attacken.
+
+ **Express 3.x WIRD NICHT MEHR GEWARTET**
+
+Bekannte und unbekannte Probleme bei Sicherheit und Leistung in 3.x wurden seit dem letzten Update (1. August 2015) noch nicht behoben. Es wird dringend empfohlen, die aktuelle Version von Express zu verwenden.
+
+If you are unable to upgrade past 3.x, please consider [Commercial Support Options](/{{ page.lang }}/support#commercial-support-options).
+
+
+
+- 3.19.1
+ - Offenlegungsgefahr beim Rootpfad in `express.static`, `res.sendfile` und `res.sendFile` behoben.
+- 3.19.0
+ - Offene Umadressierungsschwachstelle in `express.static` ([Empfehlung](https://npmjs.com/advisories/35), [CVE-2015-1164](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-1164)) behoben.
+- 3.16.10
+ - Schwachstellen durch Directory-Traversal-Technik in `express.static` behoben.
+- 3.16.6
+ - Node.js 0.10 kann in bestimmten Situationen Lecks bei `fd` aufweisen, die sich auf `express.static` und `res.sendfile` auswirken. Böswillige Anforderungen können zu Lecks bei `fd` führen und letztendlich `EMFILE`-Fehler nach sich ziehen und bewirken, dass Server nicht antworten.
+- 3.16.0
+ - Sparse-Arrays mit extrem hohen Indizes in der Abfragezeichenfolge können bewirken, dass für die Prozessausführung nicht genügend Arbeitsspeicher zur Verfügung steht und es zu einem Serverabsturz kommt.
+ - Extrem verschachtelte Abfragezeichenfolgenobjekte können bewirken, dass der Prozess blockiert und der Server dadurch vorübergehend nicht antwortet.
+- 3.3.0
+ - Die Antwort 404 bei einem nicht unterstützten Überschreibungsversuch war anfällig gegen Cross-Site Scripting-Attacken.
\ No newline at end of file
diff --git a/de/api.md b/de/api.md
old mode 100755
new mode 100644
index 1891b944f7..1b091208fc
--- a/de/api.md
+++ b/de/api.md
@@ -1,26 +1,21 @@
---
-layout: 4x-api
-title: Express 4.x - API-Referenz
+layout: api
+version: 5x
+title: Express 5.x - API-Referenz
description: Access the API reference for Express.js detailing all modules, methods, and properties for building web applications with this version.
lang: de
+redirect_from: " "
---
-
-
-
4.x-API
-
-
- {% include api/en/4x/express.md %}
+
+
5.x API
+ {% include api/en/5x/express.md %}
- {% include api/en/4x/app.md %}
-
+ {% include api/en/5x/app.md %}
- {% include api/en/4x/req.md %}
-
+ {% include api/en/5x/req.md %}
- {% include api/en/4x/res.md %}
-
+ {% include api/en/5x/res.md %}
- {% include api/en/4x/router.md %}
-
+ {% include api/en/5x/router.md %}
diff --git a/de/changelog/index.md b/de/changelog/index.md
new file mode 100644
index 0000000000..4bd4edc3ab
--- /dev/null
+++ b/de/changelog/index.md
@@ -0,0 +1,635 @@
+---
+layout: page
+title: Express changelog
+description: Stay updated with the release changelog for Express.js, detailing new features, bug fixes, and important changes across versions.
+lang: de
+sitemap: false
+redirect_from:
+ - " "
+ - " "
+---
+
+
+
+
+
+# Release changelog
+
+All the latest updates, improvements, and fixes to Express
+
+## Express v5
+
+{: id="5.x"}
+
+### 5.1.0 - Release date: 2025-03-31
+
+{: id="5.0.1"}
+
+The 5.1.0 minor release includes some new features and improvements:
+
+- Support for sending responses as Uint8Array
+- Added support for ETag option in `res.sendFile()`
+- Added support for adding multiple links with the same rel with `res.links()`
+- Performance: Use loop for acceptParams
+- [body-parser@2.2.0](https://github.com/expressjs/body-parser/releases/tag/v2.2.0)
+ - Remove legacy node.js support checks for Brotli & `AsyncLocalStorage`
+ - Remove `unpipe` & `destroy`
+- [router@2.2.0](https://github.com/pillarjs/router/releases/tag/v2.2.0)
+ - Restore `debug`. Now with the `router` scope instead of `express`.
+ - Remove legacy node.js support checks for `setImmediate`
+ - Deprecate non-native promise support
+ - Remove `after`, `safe-buffer`, `array-flatten`, `setprotoypeof`, `methods`, `utils-merge`
+- [finalhandler@2.1.0](https://github.com/pillarjs/finalhandler/releases/tag/v2.1.0)
+ - Remove legacy node.js support checks for `headersSent`, `setImmediate`, & http2 support
+ - Remove `unpipe`
+- Transitioned all remaining dependencies to use `^` ranges instead of locked versions
+- Add package.json funding field to highlight our OpenCollective
+- See [Changelog v5.1.0](https://github.com/expressjs/express/releases/tag/v5.1.0)
+
+### 5.0.1 - Release date: 2024-10-08
+
+{: id="5.0.1"}
+
+The 5.0.1 patch release includes one security fix:
+
+- Update [jshttps/cookie](https://www.npmjs.com/package/cookie) to address a [vulnerability](https://github.com/advisories/GHSA-pxg6-pf52-xh8x).
+
+### 5.0.0 - Release date: 2024-09-09
+
+{: id="5.0.0"}
+
+Check the [migration guide](/{{page.lang}}/guide/migrating-5.html) with all the changes in this new version of Express.
+
+## Express v4
+
+{: id="4.x"}
+
+### 4.21.2 - Release date: 2024-11-06
+
+{: id="4.21.2"}
+
+The 4.21.2 patch release includes one security fix:
+
+- Update [pillajs/path-to-regexp](https://www.npmjs.com/package/path-to-regexp) to address a [vulnerability](https://github.com/advisories/GHSA-rhx6-c78j-4q9w).
+
+### 4.21.1 - Release date: 2024-10-08
+
+{: id="4.21.1"}
+
+The 4.21.1 patch release includes one security fix:
+
+- Update [jshttps/cookie](https://www.npmjs.com/package/cookie) to address a [vulnerability](https://github.com/advisories/GHSA-pxg6-pf52-xh8x).
+
+### 4.21.0 - Release date: 2024-09-11
+
+{: id="4.21.0"}
+
+The 4.21.0 minor release includes one new feature:
+
+- Deprecate `res.location("back")` and `res.redirect("back")` magic string
+
+### 4.20.0 - Release date: 2024-09-10
+
+{: id="4.20.0"}
+
+The 4.20.0 minor release includes bug fixes and some new features, including:
+
+- The [`res.clearCookie()` method](/{{ page.lang }}/4x/api.html#res.clearCookie) deprecates `options.maxAge` and `options.expires` options.
+- The [`res.redirect()` method](/{{ page.lang }}/4x/api.html#res.redirect) removes HTML link rendering.
+- The [`express.urlencoded()` method](/{{ page.lang }}/4x/api.html#express.urlencoded) method now has a depth level of `32`, whereas it was previously `Infinity`.
+- Adds support for named matching groups in the routes using a regex
+- Removes encoding of `\`, `|`, and `^` to align better with URL spec
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4200--2024-09-10)
+
+### 4.19.2 - Release date: 2024-03-25
+
+{: id="4.19.2"}
+
+- Improved fix for open redirect allow list bypass
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4192--2024-03-25)
+
+### 4.19.1 - Release date: 2024-03-20
+
+{: id="4.19.1"}
+
+- Allow passing non-strings to res.location with new encoding handling checks
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4191--2024-03-20)
+
+### 4.19.0 - Release date: 2024-03-20
+
+{: id="4.19.0"}
+
+- Prevent open redirect allow list bypass due to encodeurl
+- deps: cookie@0.6.0
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4190--2024-03-20)
+
+### 4.18.3 - Release date: 2024-02-29
+
+{: id="4.18.3"}
+
+The 4.18.3 patch release includes the following bug fix:
+
+
+
+ Fix routing requests without method. ([commit](https://github.com/expressjs/express/commit/74beeac0718c928b4ba249aba3652c52fbe32ca8))
+
+
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4183--2024-02-26)
+
+### 4.18.2 - Release date: 2022-10-08
+
+{: id="4.18.2"}
+
+The 4.18.2 patch release includes the following bug fix:
+
+
+
+ Fix regression routing a large stack in a single route. ([commit](https://github.com/expressjs/express/commit/7ec5dd2b3c5e7379f68086dae72859f5573c8b9b))
+
+
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4182--2022-10-08)
+
+### 4.18.1 - Release date: 2022-04-29
+
+{: id="4.18.1"}
+
+The 4.18.1 patch release includes the following bug fix:
+
+
+
+ Fix the condition where if an Express application is created with a very large stack of routes, and all of those routes are sync (call `next()` synchronously), then the request processing may hang.
+
+
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4181--2022-04-29).
+
+### 4.18.0 - Release date: 2022-04-25
+
+{: id="4.18.0"}
+
+The 4.18.0 minor release includes bug fixes and some new features, including:
+
+
+
+ The [`app.get()` method](/{{ page.lang }}/4x/api.html#app.get) and the [`app.set()` method](/{{ page.lang }}/4x/api.html#app.set) now ignores properties directly on `Object.prototype` when getting a setting value.
+
+
+
+ The [`res.cookie()` method](/{{ page.lang }}/4x/api.html#res.cookie) now accepts a "priority" option to set the Priority attribute on the Set-Cookie response header.
+
+
+
+ The [`res.cookie()` method](/{{ page.lang }}/4x/api.html#res.cookie) now rejects an Invalid Date object provided as the "expires" option.
+
+
+
+ The [`res.cookie()` method](/{{ page.lang }}/4x/api.html#res.cookie) now works when `null` or `undefined` is explicitly provided as the "maxAge" argument.
+
+
+
+ Starting with this version, Express supports Node.js 18.x.
+
+
+
+ The [`res.download()` method](/{{ page.lang }}/4x/api.html#res.download) now accepts a "root" option to match [`res.sendFile()`](/{{ page.lang }}/4x/api.html#res.sendFile).
+
+
+
+ The [`res.download()` method](/{{ page.lang }}/4x/api.html#res.download) can be supplied with an `options` object without providing a `filename` argument, simplifying calls when the default `filename` is desired.
+
+
+
+ The [`res.format()` method](/{{ page.lang }}/4x/api.html#res.format) now invokes the provided "default" handler with the same arguments as the type handlers (`req`, `res`, and `next`).
+
+
+
+ The [`res.send()` method](/{{ page.lang }}/4x/api.html#res.send) will not attempt to send a response body when the response code is set to 205.
+
+
+
+ The default error handler will now remove certain response headers that will break the error response rendering, if they were set previously.
+
+
+
+ The status code 425 is now represented as the standard "Too Early" instead of "Unordered Collection".
+
+
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4180--2022-04-25).
+
+### 4.17.3 - Release date: 2022-02-16
+
+{: id="4.17.3"}
+
+The 4.17.3 patch release includes one bug fix:
+
+
+
+ Update to [qs module](https://www.npmjs.com/package/qs) for a fix around parsing `__proto__` properties.
+
+
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4173--2022-02-16).
+
+### 4.17.2 - Release date: 2021-12-16
+
+{: id="4.17.2"}
+
+The 4.17.2 patch release includes the following bug fixes:
+
+
+
+ Fix handling of `undefined` in `res.jsonp` when a callback is provided.
+
+
+
+ Fix handling of `undefined` in `res.json` and `res.jsonp` when `"json escape"` is enabled.
+
+
+
+ Fix handling of invalid values to the `maxAge` option of `res.cookie()`.
+
+
+
+ Update to [jshttp/proxy-addr module](https://www.npmjs.com/package/proxy-addr) to use `req.socket` over deprecated `req.connection`.
+
+
+
+ Starting with this version, Express supports Node.js 14.x.
+
+
+
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4172--2021-12-16).
+
+### 4.17.1 - Release date: 2019-05-25
+
+{: id="4.17.1"}
+
+The 4.17.1 patch release includes one bug fix:
+
+
+
+ The change to the `res.status()` API has been reverted due to causing regressions in existing Express 4 applications.
+
+
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4171--2019-05-25).
+
+### 4.17.0 - Release date: 2019-05-16
+
+{: id="4.17.0"}
+
+The 4.17.0 minor release includes bug fixes and some new features, including:
+
+
+
+ The `express.raw()` and `express.text()` middleware have been added to provide request body parsing for more raw request payloads. This uses the [expressjs/body-parser module](https://www.npmjs.com/package/body-parser) module underneath, so apps that are currently requiring the module separately can switch to the built-in parsers.
+
+
+
+ The `res.cookie()` API now supports the `"none"` value for the `sameSite` option.
+
+
+
+ When the `"trust proxy"` setting is enabled, the `req.hostname` now supports multiple `X-Forwarded-For` headers in a request.
+
+
+
+ Starting with this version, Express supports Node.js 10.x and 12.x.
+
+
+
+ The `res.sendFile()` API now provides and more immediate and easier to understand error when a non-string is passed as the `path` argument.
+
+
+
+ The `res.status()` API now provides and more immediate and easier to understand error when `null` or `undefined` is passed as the argument.
+
+
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4170--2019-05-16).
+
+### 4.16.4 - Release date: 2018-10-10
+
+{: id="4.16.4"}
+
+The 4.16.4 patch release includes various bug fixes:
+
+
+
+ Fix issue where `"Request aborted"` may be logged in `res.sendfile`.
+
+
+
+For a complete list of changes in this release, see [History.md](https://github.com/expressjs/express/blob/master/History.md#4164--2018-10-10).
+
+### 4.16.3 - Release date: 2018-03-12
+
+{: id="4.16.3"}
+
+The 4.16.3 patch release includes various bug fixes:
+
+
+
+ Fix issue where a plain `%` at the end of the url in the `res.location` method or the `res.redirect` method would not get encoded as `%25`.
+
+
+
+ Fix issue where a blank `req.url` value can result in a thrown error within the default 404 handling.
+
+
+
+ Fix the generated HTML document for `express.static` redirect responses to properly include `