Kind: Class
Source: packages/microservices/listener-metadata-explorer.ts
Part of: Microservices
ListenerMetadataExplorer discovers microservice listener metadata declared on controller methods, including message patterns and event handlers. It scans controller prototypes, converts decorator metadata into listener definitions, and identifies client hooks used by the microservices runtime during server setup.
Methods
| Method | Signature | Returns |
|---|---|---|
explore | explore(instance: Controller) | EventOrMessageListenerDefinition[] |
exploreMethodMetadata | exploreMethodMetadata(instance: Controller, instancePrototype: object, methodKey: string) | `EventOrMessageListenerDefinition |
scanForClientHooks | scanForClientHooks(instance: Controller) | IterableIterator<ClientProperties> |
Where it refuses work
ListenerMetadataExplorerstops the work with an early return whenisUndefined(handlerType).
Diagram
mermaidgraph LR Controller[Controller instance] --> Explorer[ListenerMetadataExplorer] Explorer --> Scanner[MetadataScanner] Explorer --> Reflector[Reflector] Scanner --> Methods[Controller methods] Reflector --> Metadata[Pattern and client metadata] Metadata --> Definitions[EventOrMessageListenerDefinition[]] Definitions --> Server[Microservice server bindings]
Usage
tsimport { Controller } from '@nestjs/common';
import { EventPattern, MessagePattern } from '@nestjs/microservices';
// ListenerMetadataExplorer is typically used internally by Nest's
// microservices infrastructure rather than instantiated in application code.
@Controller()
class OrdersController {
@MessagePattern('orders.find')
findOrder(data: { id: string }) {
return { id: data.id, status: 'pending' };
}
@EventPattern('orders.created')
handleOrderCreated(data: { id: string }) {
console.log(`Order created: ${data.id}`);
}
}
// During microservice initialization, Nest:
// 1. Scans OrdersController methods.
// 2. Reads @MessagePattern() and @EventPattern() metadata.
// 3. Produces listener definitions.
// 4. Registers handlers with the configured transport.
AI Coding Instructions
- Preserve metadata-driven discovery: listener definitions must be derived from method decorator metadata rather than manually inferred from method names.
- Use the framework
MetadataScannerandReflectorutilities when scanning controller prototypes; avoid scanning only instance-owned properties. - Keep message-pattern handlers and event-pattern handlers distinct, since event handlers do not follow request/response semantics.
- Ensure transport-specific metadata is respected when filtering or registering discovered listener definitions.
- Treat this class as infrastructure code: changes can affect controller discovery, client hooks, and microservice transport registration globally.
Was this page helpful?