How to Create a Subscriber
In this document, you’ll learn how to create a Subscriber in your Medusa backend that listens to events to perform an action.
Prerequisites
Medusa's event system works by pushing data to a Queue that each handler then gets notified of. The queuing system is based on Redis, so it's required for subscribers to work.
You can learn how to install Redis and configure it with Medusa before you get started.
Implementation
A subscriber is a TypeScript or JavaScript file that is created under src/subscribers
Copy to Clipboard. Its file name, by convension, should be the class name of the subscriber without the word Subscriber
Copy to Clipboard. For example, if the subscriber is HelloSubscriber
Copy to Clipboard, the file name should be hello.ts
Copy to Clipboard.
After creating the file under src/subscribers
Copy to Clipboard, in the constructor of your subscriber, listen to events using eventBusService.subscribe
Copy to Clipboard , where eventBusService
Copy to Clipboard is a service injected into your subscriber’s constructor.
The eventBusService.subscribe
Copy to Clipboard method receives the name of the event as a first parameter and as a second parameter a method in your subscriber that will handle this event.
For example, here is the OrderNotifierSubscriber
Copy to Clipboard class created in src/subscribers/orderNotifier.ts
Copy to Clipboard:
class OrderNotifierSubscriber {
constructor({ eventBusService }) {
eventBusService.subscribe("order.placed", this.handleOrder)
}
handleOrder = async (data) => {
console.log("New Order: " + data.id)
}
}
export default OrderNotifierSubscriber
This subscriber registers the method handleOrder
Copy to Clipboard as one of the handlers of the order.placed
Copy to Clipboard event. The method handleOrder
Copy to Clipboard will be executed every time an order is placed. It receives the order ID in the data
Copy to Clipboard parameter. You can then use the order’s details to perform any kind of task you need.
The data
Copy to Clipboard object won't contain other order data. Only the ID of the order. You can retrieve the order information using the orderService
Copy to Clipboard.
Using Services in Subscribers
You can access any service through the dependencies injected to your subscriber’s constructor.
For example:
class OrderNotifierSubscriber {
constructor({ productService, eventBusService }) {
this.productService = productService
eventBusService.subscribe("order.placed", this.handleOrder)
}
// ...
}
You can then use this.productService
Copy to Clipboard anywhere in your subscriber’s methods. For example:
class OrderNotifierSubscriber {
// ...
handleOrder = async (data) => {
// ...
const product = this.productService.list()
}
}
When using attributes defined in the subscriber, such as the productService
Copy to Clipboard in the example above, you must use an arrow function to declare the method. Otherwise, the attribute will be undefined when used.