diff --git a/astro/astro.config.mjs b/astro/astro.config.mjs
index 095044e693..1e41fd7e46 100644
--- a/astro/astro.config.mjs
+++ b/astro/astro.config.mjs
@@ -2,11 +2,13 @@
import { defineConfig } from 'astro/config';
import mdx from '@astrojs/mdx';
import icon from 'astro-icon';
+import remarkRewriteLocalizedLinks from './src/utils/remark/rewrite-localized-links.mjs';
// https://astro.build/config
export default defineConfig({
integrations: [mdx(), icon()],
markdown: {
+ remarkPlugins: [[remarkRewriteLocalizedLinks, { prefixes: ['guide', 'starter', 'api'] }]],
shikiConfig: {
theme: 'github-dark',
},
diff --git a/astro/src/content/docs/en/4x/guide/routing.md b/astro/src/content/docs/en/4x/guide/routing.md
index cd1f1db834..e49c4ae959 100755
--- a/astro/src/content/docs/en/4x/guide/routing.md
+++ b/astro/src/content/docs/en/4x/guide/routing.md
@@ -6,12 +6,12 @@ description: Learn how to define and use routes in Express.js applications, incl
# Routing
_Routing_ refers to how an application's endpoints (URIs) respond to client requests.
-For an introduction to routing, see [Basic routing](/{{ page.lang }}/starter/basic-routing.html).
+For an introduction to routing, see [Basic routing](/starter/basic-routing.html).
You define routing using methods of the Express `app` object that correspond to HTTP methods;
for example, `app.get()` to handle GET requests and `app.post` to handle POST requests. For a full list,
-see [app.METHOD](/{{ page.lang }}/5x/api.html#app.METHOD). You can also use [app.all()](/{{ page.lang }}/5x/api.html#app.all) to handle all HTTP methods and [app.use()](/{{ page.lang }}/5x/api.html#app.use) to
-specify middleware as the callback function (See [Using middleware](/{{ page.lang }}/guide/using-middleware.html) for details).
+see [app.METHOD](/api/application/app-METHOD). You can also use [app.all()](/api/application/app-all) to handle all HTTP methods and [app.use()](/api/application/app-use) to
+specify middleware as the callback function (See [Using middleware](/guide/using-middleware.html) for details).
These routing methods specify a callback function (sometimes called "handler functions") called when the application receives a request to the specified route (endpoint) and HTTP method. In other words, the application "listens" for requests that match the specified route(s) and method(s), and when it detects a match, it calls the specified callback function.
@@ -50,7 +50,7 @@ app.post('/', (req, res) => {
```
Express supports methods that correspond to all HTTP request methods: `get`, `post`, and so on.
-For a full list, see [app.METHOD](/{{ page.lang }}/5x/api.html#app.METHOD).
+For a full list, see [app.METHOD](/api/application/app-METHOD).
There is a special routing method, `app.all()`, used to load middleware functions at a path for _all_ HTTP request methods. For example, the following handler is executed for requests to the route `"/secret"` whether using `GET`, `POST`, `PUT`, `DELETE`, or any other HTTP request method supported in the [http module](https://nodejs.org/api/http.html#http_http_methods).
@@ -65,7 +65,7 @@ app.all('/secret', (req, res, next) => {
Route paths, in combination with a request method, define the endpoints at which requests can be made. Route paths can be strings, string patterns, or regular expressions.
-{% capture caution-character %} In express 5, the characters `?`, `+`, `*`, `[]`, and `()` are handled differently than in version 4, please review the [migration guide](/{{ page.lang }}/guide/migrating-5.html#path-syntax) for more information.{% endcapture %}
+{% capture caution-character %} In express 5, the characters `?`, `+`, `*`, `[]`, and `()` are handled differently than in version 4, please review the [migration guide](/guide/migrating-5.html#path-syntax) for more information.{% endcapture %}
{% include admonitions/caution.html content=caution-character %}
@@ -118,7 +118,7 @@ app.get('/random.text', (req, res) => {
### Route paths based on string patterns
-{% capture caution-string-patterns %} The string patterns in Express 5 no longer work. Please refer to the [migration guide](/{{ page.lang }}/guide/migrating-5.html#path-syntax) for more information.{% endcapture %}
+{% capture caution-string-patterns %} The string patterns in Express 5 no longer work. Please refer to the [migration guide](/guide/migrating-5.html#path-syntax) for more information.{% endcapture %}
{% include admonitions/caution.html content=caution-string-patterns %}
@@ -209,7 +209,7 @@ req.params: { "genus": "Prunus", "species": "persica" }
```
{% capture warning-regexp %}
-In express 5, Regexp characters are not supported in route paths, for more information please refer to the [migration guide](/{{ page.lang }}/guide/migrating-5.html#path-syntax).{% endcapture %}
+In express 5, Regexp characters are not supported in route paths, for more information please refer to the [migration guide](/guide/migrating-5.html#path-syntax).{% endcapture %}
{% include admonitions/caution.html content=warning-regexp %}
@@ -239,7 +239,7 @@ In Express 4.x, the `
Route handlers
-You can provide multiple callback functions that behave like [middleware](/{{ page.lang }}/guide/using-middleware.html) to handle a request. The only exception is that these callbacks might invoke `next('route')` to bypass the remaining route callbacks. You can use this mechanism to impose pre-conditions on a route, then pass control to subsequent routes if there's no reason to proceed with the current route.
+You can provide multiple callback functions that behave like [middleware](/guide/using-middleware.html) to handle a request. The only exception is that these callbacks might invoke `next('route')` to bypass the remaining route callbacks. You can use this mechanism to impose pre-conditions on a route, then pass control to subsequent routes if there's no reason to proceed with the current route.
```js
app.get('/user/:id', (req, res, next) => {
@@ -334,22 +334,22 @@ app.get(
The methods on the response object (`res`) in the following table can send a response to the client, and terminate the request-response cycle. If none of these methods are called from a route handler, the client request will be left hanging.
-| Method | Description |
-| --------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
-| [res.download()](/{{ page.lang }}/5x/api.html#res.download) | Prompt a file to be downloaded. |
-| [res.end()](/{{ page.lang }}/5x/api.html#res.end) | End the response process. |
-| [res.json()](/{{ page.lang }}/5x/api.html#res.json) | Send a JSON response. |
-| [res.jsonp()](/{{ page.lang }}/5x/api.html#res.jsonp) | Send a JSON response with JSONP support. |
-| [res.redirect()](/{{ page.lang }}/5x/api.html#res.redirect) | Redirect a request. |
-| [res.render()](/{{ page.lang }}/5x/api.html#res.render) | Render a view template. |
-| [res.send()](/{{ page.lang }}/5x/api.html#res.send) | Send a response of various types. |
-| [res.sendFile()](/{{ page.lang }}/5x/api.html#res.sendFile) | Send a file as an octet stream. |
-| [res.sendStatus()](/{{ page.lang }}/5x/api.html#res.sendStatus) | Set the response status code and send its string representation as the response body. |
+| Method | Description |
+| ------------------------------------------------ | ------------------------------------------------------------------------------------- |
+| [res.download()](/api/response/res-download) | Prompt a file to be downloaded. |
+| [res.end()](/api/response/res-end) | End the response process. |
+| [res.json()](/api/response/res-json) | Send a JSON response. |
+| [res.jsonp()](/api/response/res-jsonp) | Send a JSON response with JSONP support. |
+| [res.redirect()](/api/response/res-redirect) | Redirect a request. |
+| [res.render()](/api/response/res-render) | Render a view template. |
+| [res.send()](/api/response/res-send) | Send a response of various types. |
+| [res.sendFile()](/api/response/res-sendfile) | Send a file as an octet stream. |
+| [res.sendStatus()](/api/response/res-sendstatus) | Set the response status code and send its string representation as the response body. |
app.route()
You can create chainable route handlers for a route path by using `app.route()`.
-Because the path is specified at a single location, creating modular routes is helpful, as is reducing redundancy and typos. For more information about routes, see: [Router() documentation](/{{ page.lang }}/5x/api.html#router).
+Because the path is specified at a single location, creating modular routes is helpful, as is reducing redundancy and typos. For more information about routes, see: [Router() documentation](/api.html#router).
Here is an example of chained route handlers that are defined by using `app.route()`.
@@ -410,7 +410,7 @@ app.use('/birds', birds);
The app will now be able to handle requests to `/birds` and `/birds/about`, as well as call the `timeLog` middleware function that is specific to the route.
-But if the parent route `/birds` has path parameters, it will not be accessible by default from the sub-routes. To make it accessible, you will need to pass the `mergeParams` option to the Router constructor [reference](/{{ page.lang }}/5x/api.html#app.use).
+But if the parent route `/birds` has path parameters, it will not be accessible by default from the sub-routes. To make it accessible, you will need to pass the `mergeParams` option to the Router constructor [reference](/api/application/app-use).
```js
const router = express.Router({ mergeParams: true });
diff --git a/astro/src/content/docs/en/5x/guide/routing.md b/astro/src/content/docs/en/5x/guide/routing.md
index cd1f1db834..a7738ef562 100755
--- a/astro/src/content/docs/en/5x/guide/routing.md
+++ b/astro/src/content/docs/en/5x/guide/routing.md
@@ -6,12 +6,12 @@ description: Learn how to define and use routes in Express.js applications, incl
# Routing
_Routing_ refers to how an application's endpoints (URIs) respond to client requests.
-For an introduction to routing, see [Basic routing](/{{ page.lang }}/starter/basic-routing.html).
+For an introduction to routing, see [Basic routing](/starter/basic-routing.html).
You define routing using methods of the Express `app` object that correspond to HTTP methods;
for example, `app.get()` to handle GET requests and `app.post` to handle POST requests. For a full list,
-see [app.METHOD](/{{ page.lang }}/5x/api.html#app.METHOD). You can also use [app.all()](/{{ page.lang }}/5x/api.html#app.all) to handle all HTTP methods and [app.use()](/{{ page.lang }}/5x/api.html#app.use) to
-specify middleware as the callback function (See [Using middleware](/{{ page.lang }}/guide/using-middleware.html) for details).
+see [app.METHOD](/api/application/app-METHOD). You can also use [app.all()](/api/application/app-all) to handle all HTTP methods and [app.use()](/api/application/app-use) to
+specify middleware as the callback function (See [Using middleware](/guide/using-middleware.html) for details).
These routing methods specify a callback function (sometimes called "handler functions") called when the application receives a request to the specified route (endpoint) and HTTP method. In other words, the application "listens" for requests that match the specified route(s) and method(s), and when it detects a match, it calls the specified callback function.
@@ -50,7 +50,7 @@ app.post('/', (req, res) => {
```
Express supports methods that correspond to all HTTP request methods: `get`, `post`, and so on.
-For a full list, see [app.METHOD](/{{ page.lang }}/5x/api.html#app.METHOD).
+For a full list, see [app.METHOD](/api/application/app-METHOD).
There is a special routing method, `app.all()`, used to load middleware functions at a path for _all_ HTTP request methods. For example, the following handler is executed for requests to the route `"/secret"` whether using `GET`, `POST`, `PUT`, `DELETE`, or any other HTTP request method supported in the [http module](https://nodejs.org/api/http.html#http_http_methods).
@@ -65,7 +65,7 @@ app.all('/secret', (req, res, next) => {
Route paths, in combination with a request method, define the endpoints at which requests can be made. Route paths can be strings, string patterns, or regular expressions.
-{% capture caution-character %} In express 5, the characters `?`, `+`, `*`, `[]`, and `()` are handled differently than in version 4, please review the [migration guide](/{{ page.lang }}/guide/migrating-5.html#path-syntax) for more information.{% endcapture %}
+{% capture caution-character %} In express 5, the characters `?`, `+`, `*`, `[]`, and `()` are handled differently than in version 4, please review the [migration guide](/guide/migrating-5.html#path-syntax) for more information.{% endcapture %}
{% include admonitions/caution.html content=caution-character %}
@@ -118,7 +118,7 @@ app.get('/random.text', (req, res) => {
### Route paths based on string patterns
-{% capture caution-string-patterns %} The string patterns in Express 5 no longer work. Please refer to the [migration guide](/{{ page.lang }}/guide/migrating-5.html#path-syntax) for more information.{% endcapture %}
+{% capture caution-string-patterns %} The string patterns in Express 5 no longer work. Please refer to the [migration guide](/guide/migrating-5.html#path-syntax) for more information.{% endcapture %}
{% include admonitions/caution.html content=caution-string-patterns %}
@@ -209,7 +209,7 @@ req.params: { "genus": "Prunus", "species": "persica" }
```
{% capture warning-regexp %}
-In express 5, Regexp characters are not supported in route paths, for more information please refer to the [migration guide](/{{ page.lang }}/guide/migrating-5.html#path-syntax).{% endcapture %}
+In express 5, Regexp characters are not supported in route paths, for more information please refer to the [migration guide](/guide/migrating-5.html#path-syntax).{% endcapture %}
{% include admonitions/caution.html content=warning-regexp %}
@@ -239,7 +239,7 @@ In Express 4.x, the `
Route handlers
-You can provide multiple callback functions that behave like [middleware](/{{ page.lang }}/guide/using-middleware.html) to handle a request. The only exception is that these callbacks might invoke `next('route')` to bypass the remaining route callbacks. You can use this mechanism to impose pre-conditions on a route, then pass control to subsequent routes if there's no reason to proceed with the current route.
+You can provide multiple callback functions that behave like [middleware](/guide/using-middleware.html) to handle a request. The only exception is that these callbacks might invoke `next('route')` to bypass the remaining route callbacks. You can use this mechanism to impose pre-conditions on a route, then pass control to subsequent routes if there's no reason to proceed with the current route.
```js
app.get('/user/:id', (req, res, next) => {
@@ -334,22 +334,22 @@ app.get(
The methods on the response object (`res`) in the following table can send a response to the client, and terminate the request-response cycle. If none of these methods are called from a route handler, the client request will be left hanging.
-| Method | Description |
-| --------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
-| [res.download()](/{{ page.lang }}/5x/api.html#res.download) | Prompt a file to be downloaded. |
-| [res.end()](/{{ page.lang }}/5x/api.html#res.end) | End the response process. |
-| [res.json()](/{{ page.lang }}/5x/api.html#res.json) | Send a JSON response. |
-| [res.jsonp()](/{{ page.lang }}/5x/api.html#res.jsonp) | Send a JSON response with JSONP support. |
-| [res.redirect()](/{{ page.lang }}/5x/api.html#res.redirect) | Redirect a request. |
-| [res.render()](/{{ page.lang }}/5x/api.html#res.render) | Render a view template. |
-| [res.send()](/{{ page.lang }}/5x/api.html#res.send) | Send a response of various types. |
-| [res.sendFile()](/{{ page.lang }}/5x/api.html#res.sendFile) | Send a file as an octet stream. |
-| [res.sendStatus()](/{{ page.lang }}/5x/api.html#res.sendStatus) | Set the response status code and send its string representation as the response body. |
+| Method | Description |
+| ------------------------------------------------ | ------------------------------------------------------------------------------------- |
+| [res.download()](/api/response/res-download) | Prompt a file to be downloaded. |
+| [res.end()](/api/response/res-end) | End the response process. |
+| [res.json()](/api/response/res-json) | Send a JSON response. |
+| [res.jsonp()](/api/response/res-jsonp) | Send a JSON response with JSONP support. |
+| [res.redirect()](/api/response/res-redirect) | Redirect a request. |
+| [res.render()](/api/response/res-render) | Render a view template. |
+| [res.send()](/api/response/res-send) | Send a response of various types. |
+| [res.sendFile()](/api/response/res-sendFile) | Send a file as an octet stream. |
+| [res.sendStatus()](/api/response/res-sendStatus) | Set the response status code and send its string representation as the response body. |
app.route()
You can create chainable route handlers for a route path by using `app.route()`.
-Because the path is specified at a single location, creating modular routes is helpful, as is reducing redundancy and typos. For more information about routes, see: [Router() documentation](/{{ page.lang }}/5x/api.html#router).
+Because the path is specified at a single location, creating modular routes is helpful, as is reducing redundancy and typos. For more information about routes, see: [Router() documentation](/api.html#router).
Here is an example of chained route handlers that are defined by using `app.route()`.
@@ -410,7 +410,7 @@ app.use('/birds', birds);
The app will now be able to handle requests to `/birds` and `/birds/about`, as well as call the `timeLog` middleware function that is specific to the route.
-But if the parent route `/birds` has path parameters, it will not be accessible by default from the sub-routes. To make it accessible, you will need to pass the `mergeParams` option to the Router constructor [reference](/{{ page.lang }}/5x/api.html#app.use).
+But if the parent route `/birds` has path parameters, it will not be accessible by default from the sub-routes. To make it accessible, you will need to pass the `mergeParams` option to the Router constructor [reference](/api/application/app-use).
```js
const router = express.Router({ mergeParams: true });
diff --git a/astro/src/content/docs/es/5x/guide/routing.md b/astro/src/content/docs/es/5x/guide/routing.md
new file mode 100755
index 0000000000..a7738ef562
--- /dev/null
+++ b/astro/src/content/docs/es/5x/guide/routing.md
@@ -0,0 +1,417 @@
+---
+title: Express routing
+description: Learn how to define and use routes in Express.js applications, including route methods, route paths, parameters, and using Router for modular routing.
+---
+
+# Routing
+
+_Routing_ refers to how an application's endpoints (URIs) respond to client requests.
+For an introduction to routing, see [Basic routing](/starter/basic-routing.html).
+
+You define routing using methods of the Express `app` object that correspond to HTTP methods;
+for example, `app.get()` to handle GET requests and `app.post` to handle POST requests. For a full list,
+see [app.METHOD](/api/application/app-METHOD). You can also use [app.all()](/api/application/app-all) to handle all HTTP methods and [app.use()](/api/application/app-use) to
+specify middleware as the callback function (See [Using middleware](/guide/using-middleware.html) for details).
+
+These routing methods specify a callback function (sometimes called "handler functions") called when the application receives a request to the specified route (endpoint) and HTTP method. In other words, the application "listens" for requests that match the specified route(s) and method(s), and when it detects a match, it calls the specified callback function.
+
+In fact, the routing methods can have more than one callback function as arguments.
+With multiple callback functions, it is important to provide `next` as an argument to the callback function and then call `next()` within the body of the function to hand off control
+to the next callback.
+
+The following code is an example of a very basic route.
+
+```js
+const express = require('express');
+const app = express();
+
+// respond with "hello world" when a GET request is made to the homepage
+app.get('/', (req, res) => {
+ res.send('hello world');
+});
+```
+
+Route methods
+
+A route method is derived from one of the HTTP methods, and is attached to an instance of the `express` class.
+
+The following code is an example of routes that are defined for the `GET` and the `POST` methods to the root of the app.
+
+```js
+// GET method route
+app.get('/', (req, res) => {
+ res.send('GET request to the homepage');
+});
+
+// POST method route
+app.post('/', (req, res) => {
+ res.send('POST request to the homepage');
+});
+```
+
+Express supports methods that correspond to all HTTP request methods: `get`, `post`, and so on.
+For a full list, see [app.METHOD](/api/application/app-METHOD).
+
+There is a special routing method, `app.all()`, used to load middleware functions at a path for _all_ HTTP request methods. For example, the following handler is executed for requests to the route `"/secret"` whether using `GET`, `POST`, `PUT`, `DELETE`, or any other HTTP request method supported in the [http module](https://nodejs.org/api/http.html#http_http_methods).
+
+```js
+app.all('/secret', (req, res, next) => {
+ console.log('Accessing the secret section ...');
+ next(); // pass control to the next handler
+});
+```
+
+Route paths
+
+Route paths, in combination with a request method, define the endpoints at which requests can be made. Route paths can be strings, string patterns, or regular expressions.
+
+{% capture caution-character %} In express 5, the characters `?`, `+`, `*`, `[]`, and `()` are handled differently than in version 4, please review the [migration guide](/guide/migrating-5.html#path-syntax) for more information.{% endcapture %}
+
+{% include admonitions/caution.html content=caution-character %}
+
+{% capture note-dollar-character %}In express 4, regular expression characters such as `$` need to be escaped with a `\`.
+{% endcapture %}
+
+{% include admonitions/caution.html content=note-dollar-character %}
+
+{% capture note-path-to-regexp %}
+
+Express uses [path-to-regexp](https://www.npmjs.com/package/path-to-regexp) for matching the route paths; see the path-to-regexp documentation for all the possibilities in defining route paths. [Express Playground Router](https://bjohansebas.github.io/playground-router/) is a handy tool for testing basic Express routes, although it does not support pattern matching.
+
+{% endcapture %}
+
+{% include admonitions/note.html content=note-path-to-regexp %}
+
+{% capture query-string-note %}
+
+Query strings are not part of the route path.
+
+{% endcapture %}
+
+{% include admonitions/warning.html content=query-string-note %}
+
+### Route paths based on strings
+
+This route path will match requests to the root route, `/`.
+
+```js
+app.get('/', (req, res) => {
+ res.send('root');
+});
+```
+
+This route path will match requests to `/about`.
+
+```js
+app.get('/about', (req, res) => {
+ res.send('about');
+});
+```
+
+This route path will match requests to `/random.text`.
+
+```js
+app.get('/random.text', (req, res) => {
+ res.send('random.text');
+});
+```
+
+### Route paths based on string patterns
+
+{% capture caution-string-patterns %} The string patterns in Express 5 no longer work. Please refer to the [migration guide](/guide/migrating-5.html#path-syntax) for more information.{% endcapture %}
+
+{% include admonitions/caution.html content=caution-string-patterns %}
+
+This route path will match `acd` and `abcd`.
+
+```js
+app.get('/ab?cd', (req, res) => {
+ res.send('ab?cd');
+});
+```
+
+This route path will match `abcd`, `abbcd`, `abbbcd`, and so on.
+
+```js
+app.get('/ab+cd', (req, res) => {
+ res.send('ab+cd');
+});
+```
+
+This route path will match `abcd`, `abxcd`, `abRANDOMcd`, `ab123cd`, and so on.
+
+```js
+app.get('/ab*cd', (req, res) => {
+ res.send('ab*cd');
+});
+```
+
+This route path will match `/abe` and `/abcde`.
+
+```js
+app.get('/ab(cd)?e', (req, res) => {
+ res.send('ab(cd)?e');
+});
+```
+
+### Route paths based on regular expressions
+
+This route path will match anything with an "a" in it.
+
+```js
+app.get(/a/, (req, res) => {
+ res.send('/a/');
+});
+```
+
+This route path will match `butterfly` and `dragonfly`, but not `butterflyman`, `dragonflyman`, and so on.
+
+```js
+app.get(/.*fly$/, (req, res) => {
+ res.send('/.*fly$/');
+});
+```
+
+Route parameters
+
+Route parameters are named URL segments that are used to capture the values specified at their position in the URL. The captured values are populated in the `req.params` object, with the name of the route parameter specified in the path as their respective keys.
+
+```
+Route path: /users/:userId/books/:bookId
+Request URL: http://localhost:3000/users/34/books/8989
+req.params: { "userId": "34", "bookId": "8989" }
+```
+
+To define routes with route parameters, simply specify the route parameters in the path of the route as shown below.
+
+```js
+app.get('/users/:userId/books/:bookId', (req, res) => {
+ res.send(req.params);
+});
+```
+
+