docs: update listen to use port env variable

This commit is contained in:
Kamil Myśliwiec
2024-10-17 10:10:09 +02:00
parent 3b7cc155a6
commit 56fd4a2641
21 changed files with 68 additions and 70 deletions

View File

@@ -1,4 +1,5 @@
{ {
"singleQuote": true, "singleQuote": true,
"trailingComma": "all" "trailingComma": "all",
"printWidth": 80
} }

View File

@@ -40,7 +40,7 @@ async function bootstrap() {
await app.close(); await app.close();
} else { } else {
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
} }
``` ```
@@ -232,9 +232,7 @@ const publishOptions = {
sha: process.env.CI_COMMIT_SHA, sha: process.env.CI_COMMIT_SHA,
target: process.env.CI_MERGE_REQUEST_DIFF_BASE_SHA, target: process.env.CI_MERGE_REQUEST_DIFF_BASE_SHA,
trigger: process.env.CI_MERGE_REQUEST_DIFF_BASE_SHA ? 'pull' : 'push', trigger: process.env.CI_MERGE_REQUEST_DIFF_BASE_SHA ? 'pull' : 'push',
branch: branch: process.env.CI_COMMIT_BRANCH ?? process.env.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME,
process.env.CI_COMMIT_BRANCH ??
process.env.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME,
}; };
``` ```

View File

@@ -9,7 +9,7 @@ async function bootstrap() {
const app = await NestFactory.create(AppModule, { const app = await NestFactory.create(AppModule, {
snapshot: true, snapshot: true,
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
``` ```
@@ -185,7 +185,7 @@ This page comes in handy when you want to identify potential issues in your appl
To save a serialized graph to a file, use the following code: To save a serialized graph to a file, use the following code:
```typescript ```typescript
await app.listen(3000); // OR await app.init() await app.listen(process.env.PORT ?? 3000); // OR await app.init()
fs.writeFileSync('./graph.json', app.get(SerializedGraph).toString()); fs.writeFileSync('./graph.json', app.get(SerializedGraph).toString());
``` ```

View File

@@ -141,7 +141,10 @@ Nest provides a set of standard exceptions that inherit from the base `HttpExcep
All the built-in exceptions can also provide both an error `cause` and an error description using the `options` parameter: All the built-in exceptions can also provide both an error `cause` and an error description using the `options` parameter:
```typescript ```typescript
throw new BadRequestException('Something bad happened', { cause: new Error(), description: 'Some error description' }) throw new BadRequestException('Something bad happened', {
cause: new Error(),
description: 'Some error description',
});
``` ```
Using the above, this is how the response would look: Using the above, this is how the response would look:
@@ -150,7 +153,7 @@ Using the above, this is how the response would look:
{ {
"message": "Something bad happened", "message": "Something bad happened",
"error": "Some error description", "error": "Some error description",
"statusCode": 400, "statusCode": 400
} }
``` ```
@@ -278,7 +281,7 @@ To create a global-scoped filter, you would do the following:
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new HttpExceptionFilter()); app.useGlobalFilters(new HttpExceptionFilter());
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
``` ```
@@ -394,7 +397,7 @@ async function bootstrap() {
const { httpAdapter } = app.get(HttpAdapterHost); const { httpAdapter } = app.get(HttpAdapterHost);
app.useGlobalFilters(new AllExceptionsFilter(httpAdapter)); app.useGlobalFilters(new AllExceptionsFilter(httpAdapter));
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
``` ```

View File

@@ -18,7 +18,7 @@ async function bootstrap() {
const app = await NestFactory.create(AppModule, { const app = await NestFactory.create(AppModule, {
forceCloseConnections: true, forceCloseConnections: true,
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();

View File

@@ -10,7 +10,7 @@ const httpsOptions = {
const app = await NestFactory.create(AppModule, { const app = await NestFactory.create(AppModule, {
httpsOptions, httpsOptions,
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
If you use the `FastifyAdapter`, create the application as follows: If you use the `FastifyAdapter`, create the application as follows:
@@ -33,10 +33,7 @@ const httpsOptions = {
}; };
const server = express(); const server = express();
const app = await NestFactory.create( const app = await NestFactory.create(AppModule, new ExpressAdapter(server));
AppModule,
new ExpressAdapter(server),
);
await app.init(); await app.init();
const httpServer = http.createServer(server).listen(3000); const httpServer = http.createServer(server).listen(3000);
@@ -56,7 +53,8 @@ export class ShutdownObserver implements OnApplicationShutdown {
public async onApplicationShutdown(): Promise<void> { public async onApplicationShutdown(): Promise<void> {
await Promise.all( await Promise.all(
this.httpServers.map((server) => this.httpServers.map(
(server) =>
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
server.close((error) => { server.close((error) => {
if (error) { if (error) {
@@ -65,7 +63,7 @@ export class ShutdownObserver implements OnApplicationShutdown {
resolve(null); resolve(null);
} }
}); });
}) }),
), ),
); );
} }

View File

@@ -17,7 +17,7 @@ import { AppModule } from './app.module';
const app = await NestFactory.create<NestExpressApplication>(AppModule, { const app = await NestFactory.create<NestExpressApplication>(AppModule, {
rawBody: true, rawBody: true,
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
To access the raw request body in a controller, a convenience interface `RawBodyRequest` is provided to expose a `rawBody` field on the request: use the interface `RawBodyRequest` type: To access the raw request body in a controller, a convenience interface `RawBodyRequest` is provided to expose a `rawBody` field on the request: use the interface `RawBodyRequest` type:
@@ -77,7 +77,7 @@ const app = await NestFactory.create<NestFastifyApplication>(
rawBody: true, rawBody: true,
}, },
); );
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
To access the raw request body in a controller, a convenience interface `RawBodyRequest` is provided to expose a `rawBody` field on the request: use the interface `RawBodyRequest` type: To access the raw request body in a controller, a convenience interface `RawBodyRequest` is provided to expose a `rawBody` field on the request: use the interface `RawBodyRequest` type:

View File

@@ -37,7 +37,7 @@ import { AppModule } from './app.module';
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create(AppModule, { logger: ['error'] }); const app = await NestFactory.create(AppModule, { logger: ['error'] });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();

View File

@@ -56,7 +56,7 @@ import { AppModule } from './app.module';
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
@@switch @@switch
@@ -65,7 +65,7 @@ import { AppModule } from './app.module';
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
``` ```

View File

@@ -84,7 +84,7 @@ async function bootstrap() {
// Starts listening for shutdown hooks // Starts listening for shutdown hooks
app.enableShutdownHooks(); app.enableShutdownHooks();
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
``` ```

View File

@@ -22,7 +22,6 @@ You implement custom Nest middleware in either a function, or in a class with an
> warning **Warning** `Express` and `fastify` handle middleware differently and provide different method signatures, read more [here](/techniques/performance#middleware). > warning **Warning** `Express` and `fastify` handle middleware differently and provide different method signatures, read more [here](/techniques/performance#middleware).
```typescript ```typescript
@@filename(logger.middleware) @@filename(logger.middleware)
import { Injectable, NestMiddleware } from '@nestjs/common'; import { Injectable, NestMiddleware } from '@nestjs/common';
@@ -132,7 +131,10 @@ export class AppModule {
Pattern based routes are supported as well. For instance, the asterisk is used as a **wildcard**, and will match any combination of characters: Pattern based routes are supported as well. For instance, the asterisk is used as a **wildcard**, and will match any combination of characters:
```typescript ```typescript
forRoutes({ path: 'ab*cd', method: RequestMethod.ALL }); forRoutes({
path: 'ab*cd',
method: RequestMethod.ALL,
});
``` ```
The `'ab*cd'` route path will match `abcd`, `ab_cd`, `abecd`, and so on. The characters `?`, `+`, `*`, and `()` may be used in a route path, and are subsets of their regular expression counterparts. The hyphen ( `-`) and the dot (`.`) are interpreted literally by string-based paths. The `'ab*cd'` route path will match `abcd`, `ab_cd`, `abecd`, and so on. The characters `?`, `+`, `*`, and `()` may be used in a route path, and are subsets of their regular expression counterparts. The hyphen ( `-`) and the dot (`.`) are interpreted literally by string-based paths.
@@ -245,7 +247,7 @@ If we want to bind middleware to every registered route at once, we can use the
@@filename(main) @@filename(main)
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
app.use(logger); app.use(logger);
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
> info **Hint** Accessing the DI container in a global middleware is not possible. You can use a [functional middleware](middleware#functional-middleware) instead when using `app.use()`. Alternatively, you can use a class middleware and consume it with `.forRoutes('*')` within the `AppModule` (or any other module). > info **Hint** Accessing the DI container in a global middleware is not possible. You can use a [functional middleware](middleware#functional-middleware) instead when using `app.use()`. Alternatively, you can use a class middleware and consume it with `.forRoutes('*')` within the `AppModule` (or any other module).

View File

@@ -32,7 +32,7 @@ async function bootstrap() {
const document = SwaggerModule.createDocument(app, config); const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, document); SwaggerModule.setup('api', app, document);
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
``` ```
@@ -62,14 +62,15 @@ As you can see, the `SwaggerModule` automatically reflects all of your endpoints
> info **Hint** To generate and download a Swagger JSON file, navigate to `http://localhost:3000/api-json` (assuming that your Swagger documentation is available under `http://localhost:3000/api`). > info **Hint** To generate and download a Swagger JSON file, navigate to `http://localhost:3000/api-json` (assuming that your Swagger documentation is available under `http://localhost:3000/api`).
> It is also possible to expose it on a route of your choice using only the setup method from `@nestjs/swagger`, like this: > It is also possible to expose it on a route of your choice using only the setup method from `@nestjs/swagger`, like this:
>
> ```typescript > ```typescript
> SwaggerModule.setup('swagger', app, document, { > SwaggerModule.setup('swagger', app, document, {
> jsonDocumentUrl: 'swagger/json', > jsonDocumentUrl: 'swagger/json',
> }); > });
> ``` > ```
>
> Which would expose it at `http://localhost:3000/swagger/json` > Which would expose it at `http://localhost:3000/swagger/json`
> warning **Warning** When using `fastify` and `helmet`, there may be a problem with [CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP), to solve this collision, configure the CSP as shown below: > warning **Warning** When using `fastify` and `helmet`, there may be a problem with [CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP), to solve this collision, configure the CSP as shown below:
> >
> ```typescript > ```typescript

View File

@@ -75,7 +75,7 @@ async function bootstrap() {
}); });
SwaggerModule.setup('api/dogs', app, dogDocument); SwaggerModule.setup('api/dogs', app, dogDocument);
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
``` ```

View File

@@ -430,7 +430,7 @@ Since the `ValidationPipe` was created to be as generic as possible, we can real
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe()); app.useGlobalPipes(new ValidationPipe());
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
``` ```

View File

@@ -60,7 +60,7 @@ declare const module: any;
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
if (module.hot) { if (module.hot) {
module.hot.accept(); module.hot.accept();
@@ -127,10 +127,7 @@ module.exports = {
resolve: { resolve: {
extensions: ['.tsx', '.ts', '.js'], extensions: ['.tsx', '.ts', '.js'],
}, },
plugins: [ plugins: [new webpack.HotModuleReplacementPlugin(), new RunScriptWebpackPlugin({ name: 'server.js', autoRestart: false })],
new webpack.HotModuleReplacementPlugin(),
new RunScriptWebpackPlugin({ name: 'server.js', autoRestart: false }),
],
output: { output: {
path: path.join(__dirname, 'dist'), path: path.join(__dirname, 'dist'),
filename: 'server.js', filename: 'server.js',
@@ -151,7 +148,7 @@ declare const module: any;
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
if (module.hot) { if (module.hot) {
module.hot.accept(); module.hot.accept();

View File

@@ -9,7 +9,7 @@ To enable CORS, call the `enableCors()` method on the Nest application object.
```typescript ```typescript
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
app.enableCors(); app.enableCors();
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
The `enableCors()` method takes an optional configuration object argument. The available properties of this object are described in the official [CORS](https://github.com/expressjs/cors#configuration-options) documentation. Another way is to pass a [callback function](https://github.com/expressjs/cors#configuring-cors-asynchronously) that lets you define the configuration object asynchronously based on the request (on the fly). The `enableCors()` method takes an optional configuration object argument. The available properties of this object are described in the official [CORS](https://github.com/expressjs/cors#configuration-options) documentation. Another way is to pass a [callback function](https://github.com/expressjs/cors#configuring-cors-asynchronously) that lets you define the configuration object asynchronously based on the request (on the fly).
@@ -19,5 +19,5 @@ Or, pass a [CORS configuration object](https://github.com/expressjs/cors#configu
```typescript ```typescript
const app = await NestFactory.create(AppModule, { cors: true }); const app = await NestFactory.create(AppModule, { cors: true });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```

View File

@@ -21,7 +21,7 @@ To disable logging, set the `logger` property to `false` in the (optional) Nest
const app = await NestFactory.create(AppModule, { const app = await NestFactory.create(AppModule, {
logger: false, logger: false,
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
To enable specific logging levels, set the `logger` property to an array of strings specifying the log levels to display, as follows: To enable specific logging levels, set the `logger` property to an array of strings specifying the log levels to display, as follows:
@@ -30,7 +30,7 @@ To enable specific logging levels, set the `logger` property to an array of stri
const app = await NestFactory.create(AppModule, { const app = await NestFactory.create(AppModule, {
logger: ['error', 'warn'], logger: ['error', 'warn'],
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
Values in the array can be any combination of `'log'`, `'fatal'`, `'error'`, `'warn'`, `'debug'`, and `'verbose'`. Values in the array can be any combination of `'log'`, `'fatal'`, `'error'`, `'warn'`, `'debug'`, and `'verbose'`.
@@ -45,7 +45,7 @@ You can provide a custom logger implementation to be used by Nest for system log
const app = await NestFactory.create(AppModule, { const app = await NestFactory.create(AppModule, {
logger: console, logger: console,
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
Implementing your own custom logger is straightforward. Simply implement each of the methods of the `LoggerService` interface as shown below. Implementing your own custom logger is straightforward. Simply implement each of the methods of the `LoggerService` interface as shown below.
@@ -93,7 +93,7 @@ You can then supply an instance of `MyLogger` via the `logger` property of the N
const app = await NestFactory.create(AppModule, { const app = await NestFactory.create(AppModule, {
logger: new MyLogger(), logger: new MyLogger(),
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
This technique, while simple, doesn't utilize dependency injection for the `MyLogger` class. This can pose some challenges, particularly for testing, and limit the reusability of `MyLogger`. For a better solution, see the <a href="techniques/logger#dependency-injection">Dependency Injection</a> section below. This technique, while simple, doesn't utilize dependency injection for the `MyLogger` class. This can pose some challenges, particularly for testing, and limit the reusability of `MyLogger`. For a better solution, see the <a href="techniques/logger#dependency-injection">Dependency Injection</a> section below.
@@ -148,7 +148,7 @@ const app = await NestFactory.create(AppModule, {
bufferLogs: true, bufferLogs: true,
}); });
app.useLogger(app.get(MyLogger)); app.useLogger(app.get(MyLogger));
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
> info **Note** In the example above, we set the `bufferLogs` to `true` to make sure all logs will be buffered until a custom logger is attached (`MyLogger` in this case) and the application initialisation process either completes or fails. If the initialisation process fails, Nest will fallback to the original `ConsoleLogger` to print out any reported error messages. Also, you can set the `autoFlushLogs` to `false` (default `true`) to manually flush logs (using the `Logger#flush()` method). > info **Note** In the example above, we set the `bufferLogs` to `true` to make sure all logs will be buffered until a custom logger is attached (`MyLogger` in this case) and the application initialisation process either completes or fails. If the initialisation process fails, Nest will fallback to the original `ConsoleLogger` to print out any reported error messages. Also, you can set the `autoFlushLogs` to `false` (default `true`) to manually flush logs (using the `Logger#flush()` method).
@@ -249,7 +249,7 @@ const app = await NestFactory.create(AppModule, {
bufferLogs: true, bufferLogs: true,
}); });
app.useLogger(new MyLogger()); app.useLogger(new MyLogger());
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
> info **Hint** Alternatively, instead of setting `bufferLogs` to `true`, you could temporarily disable the logger with `logger: false` instruction. Be mindful that if you supply `logger: false` to `NestFactory.create`, nothing will be logged until you call `useLogger`, so you may miss some important initialization errors. If you don't mind that some of your initial messages will be logged with the default logger, you can just omit the `logger: false` option. > info **Hint** Alternatively, instead of setting `bufferLogs` to `true`, you could temporarily disable the logger with `logger: false` instruction. Be mindful that if you supply `logger: false` to `NestFactory.create`, nothing will be logged until you call `useLogger`, so you may miss some important initialization errors. If you don't mind that some of your initial messages will be logged with the default logger, you can just omit the `logger: false` option.

View File

@@ -33,7 +33,7 @@ async function bootstrap() {
app.setBaseViewsDir(join(__dirname, '..', 'views')); app.setBaseViewsDir(join(__dirname, '..', 'views'));
app.setViewEngine('hbs'); app.setViewEngine('hbs');
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
@@switch @@switch
@@ -50,7 +50,7 @@ async function bootstrap() {
app.setBaseViewsDir(join(__dirname, '..', 'views')); app.setBaseViewsDir(join(__dirname, '..', 'views'));
app.setViewEngine('hbs'); app.setViewEngine('hbs');
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
``` ```
@@ -156,7 +156,7 @@ async function bootstrap() {
}, },
templates: join(__dirname, '..', 'views'), templates: join(__dirname, '..', 'views'),
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
@@switch @@switch
@@ -177,7 +177,7 @@ async function bootstrap() {
}, },
templates: join(__dirname, '..', 'views'), templates: join(__dirname, '..', 'views'),
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
``` ```

View File

@@ -34,7 +34,7 @@ async function bootstrap() {
AppModule, AppModule,
new FastifyAdapter() new FastifyAdapter()
); );
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
``` ```
@@ -74,7 +74,6 @@ You can pass options into the Fastify constructor through the `FastifyAdapter` c
new FastifyAdapter({ logger: true }); new FastifyAdapter({ logger: true });
``` ```
#### Middleware #### Middleware
Middleware functions retrieve the raw `req` and `res` objects instead of Fastify's wrappers. This is how the `middie` package works (that's used under the hood) and `fastify` - check out this [page](https://www.fastify.io/docs/latest/Reference/Middleware/) for more information, Middleware functions retrieve the raw `req` and `res` objects instead of Fastify's wrappers. This is how the `middie` package works (that's used under the hood) and `fastify` - check out this [page](https://www.fastify.io/docs/latest/Reference/Middleware/) for more information,
@@ -128,7 +127,6 @@ newFeature() {
> info **Hint** `@RouteConfig()` and `@RouteConstraints` are imported from `@nestjs/platform-fastify`. > info **Hint** `@RouteConfig()` and `@RouteConstraints` are imported from `@nestjs/platform-fastify`.
#### Example #### Example
A working example is available [here](https://github.com/nestjs/nest/tree/master/sample/10-fastify). A working example is available [here](https://github.com/nestjs/nest/tree/master/sample/10-fastify).

View File

@@ -141,7 +141,7 @@ We'll start by binding `ValidationPipe` at the application level, thus ensuring
async function bootstrap() { async function bootstrap() {
const app = await NestFactory.create(AppModule); const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe()); app.useGlobalPipes(new ValidationPipe());
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
} }
bootstrap(); bootstrap();
``` ```

View File

@@ -40,7 +40,7 @@ const app = await NestFactory.create(AppModule);
app.enableVersioning({ app.enableVersioning({
type: VersioningType.URI, type: VersioningType.URI,
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
> warning **Notice** The version in the URI will be automatically prefixed with `v` by default, however the prefix value can be configured by setting the `prefix` key to your desired prefix or `false` if you wish to disable it. > warning **Notice** The version in the URI will be automatically prefixed with `v` by default, however the prefix value can be configured by setting the `prefix` key to your desired prefix or `false` if you wish to disable it.
@@ -62,7 +62,7 @@ app.enableVersioning({
type: VersioningType.HEADER, type: VersioningType.HEADER,
header: 'Custom-Header', header: 'Custom-Header',
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
The `header` property should be the name of the header that will contain the version of the request. The `header` property should be the name of the header that will contain the version of the request.
@@ -84,7 +84,7 @@ app.enableVersioning({
type: VersioningType.MEDIA_TYPE, type: VersioningType.MEDIA_TYPE,
key: 'v=', key: 'v=',
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
The `key` property should be the key and separator of the key-value pair that contains the version. For the example `Accept: application/json;v=2`, the `key` property would be set to `v=`. The `key` property should be the key and separator of the key-value pair that contains the version. For the example `Accept: application/json;v=2`, the `key` property would be set to `v=`.
@@ -130,7 +130,7 @@ app.enableVersioning({
type: VersioningType.CUSTOM, type: VersioningType.CUSTOM,
extractor, extractor,
}); });
await app.listen(3000); await app.listen(process.env.PORT ?? 3000);
``` ```
#### Usage #### Usage