# Middleware
Middleware allows you to manipulate queries and mutations before and after they are executed.
A use-case could be to inject variable-values into the query or to add something to the response from your backend.
# Defining middleware
Your middleware should be defined as a class that implements one of the interfaces below.
You can implement multiple interfaces, that will allow your middleware to manipulate queries, variables, HTTP-responses, etc.
# HeaderManipulator
Manipulate headers on HTTP-requests before they are sent off.
Example:
export class MyMiddleware implements HeaderManipulator {
manipulateHeaders(headers: HttpHeaders, query: Document, variables: any): HttpHeaders {
if (something) {
return headers.append('my-header', 'my-value');
}
return headers;
}
}
# QueryManipulator
Manipulate queries and mutations before they are executed.
Example:
export class MyMiddleware implements QueryManipulator {
manipulateQuery(query: Document, variables: any, options: QueryOptions | WatchQueryOptions | MutationOptions): Document {
return query;
}
}
# ResponseManipulator
Will be called when the HTTP-link receives a response from the GraphQL-server.
Example:
export class MyMiddleware implements ResponseManipulator {
manipulateResponse(response: any, query: Document, variables: any): any {
return response;
}
}
# VariableManipulator
Will be called just before the query/ mutation is executed. Allows you to manipulate the defined variables and their values.
Example:
export class MyMiddleware implements VariableManipulator {
manipulateVariables(query: Document, variables: any, options: QueryOptions | WatchQueryOptions | MutationOptions): any {
return variables;
}
}
# Registering middleware
# Local middleware
Currently not supported
# Global middleware
Simply add an array of middleware to the middleware
-parameter in BuoyOptions.
# Global middleware with dependencies
Sometimes you may need to access a service inside your middleware. In order to give access to your custom services, you must inject them into the middleware when registering it.
Example:
export class AppModule {
constructor(
private buoy: Buoy,
private myService: MyService
) {
// Register Buoy middleware
this.buoy.registerMiddleware(
MyMiddleware,
[this.myService] // Parameters
);
}
}
Buoy will automatically add all parameters defined when registering, to the middleware when it is initialized.
Example:
export class MyMiddleware {
constructor(private myService: MyService) { }
}