Manual validation
Validate using methods
Inject the OpenAPIValidatorService
using the OPENAPI_VALIDATOR
token for custom validation logic in guards, filters, services, or middleware:
typescript
import { Injectable, Inject } from "@nestjs/common";
import { HttpArgumentsHost } from "@nestjs/common/interfaces";
import {
OPENAPI_VALIDATOR,
OpenAPIValidatorService,
} from "@nest-openapi/validator";
@Injectable()
export class MyService {
constructor(
@Inject(OPENAPI_VALIDATOR)
private readonly validator: OpenAPIValidatorService
) {}
validateData(httpContext: HttpArgumentsHost, responseBody) {
// Validate requests manually
const bodyOnlyErrors = this.validator.validateRequest(httpContext, {
body: true,
params: false,
query: false,
});
// Validate responses manually
const responseErrors = this.validator.validateResponse(
httpContext,
statusCode,
responseBody
);
}
}
Error response validation
By default, the response validation interceptor only validates successful responses that flow through the normal pipeline. However, error responses (like NotFoundException
, BadRequestException
, etc.) bypass interceptors and go through exception filters.
To validate error responses, inject the validator service in your exception filter:
typescript
import {
Catch,
ExceptionFilter,
ArgumentsHost,
Injectable,
Inject,
} from "@nestjs/common";
import {
OPENAPI_VALIDATOR,
OpenAPIValidatorService,
} from "@nest-openapi/validator";
@Catch()
@Injectable()
export class GlobalExceptionFilter implements ExceptionFilter {
constructor(
@Inject(OPENAPI_VALIDATOR)
private readonly validator: OpenAPIValidatorService
) {}
catch(exception: any, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
const status = exception.getStatus?.() || 500;
const responseBody = {
message: exception.message,
statusCode: status,
timestamp: new Date().toISOString(),
};
const validationErrors = this.validator.validateResponse(
ctx,
status,
responseBody
);
if (validationErrors.length > 0) {
console.warn("Error response validation failed:", validationErrors);
// Handle validation errors as needed
}
response.status(status).json(responseBody);
}
}
Then register your exception filter:
typescript
// app.module.ts
@Module({
providers: [
{
provide: APP_FILTER,
useClass: GlobalExceptionFilter,
},
],
})
export class AppModule {}