Skip to main content

How to Create a Subscriber

In this document, you’ll learn how to create a Subscriber in Medusa that listens to events to perform an action.

Implementation

A subscriber is a TypeScript or JavaScript file that is created under src/subscribersCopy to Clipboard. Its file name, by convention, should be the class name of the subscriber without the word SubscriberCopy to Clipboard. For example, if the subscriber is HelloSubscriberCopy to Clipboard, the file name should be hello.tsCopy to Clipboard.

After creating the file under src/subscribersCopy to Clipboard, in the constructor of your subscriber, listen to events using eventBusService.subscribeCopy to Clipboard , where eventBusServiceCopy to Clipboard is a service injected into your subscriber’s constructor.

The eventBusService.subscribeCopy 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 OrderNotifierSubscriberCopy to Clipboard class created in src/subscribers/orderNotifier.tsCopy to Clipboard:

src/subscribers/orderNotifier.ts
class OrderNotifierSubscriber {
constructor({ eventBusService }) {
eventBusService.subscribe("order.placed", this.handleOrder)
}

handleOrder = async (data) => {
console.log("New Order: " + data.id)
}
}

export default OrderNotifierSubscriber
Report Incorrect CodeCopy to Clipboard

This subscriber registers the method handleOrderCopy to Clipboard as one of the handlers of the order.placedCopy to Clipboard event. The method handleOrderCopy to Clipboard will be executed every time an order is placed. It receives the order ID in the dataCopy to Clipboard parameter. You can then use the order’s details to perform any kind of task you need.

For the order.placedCopy to Clipboard event, the dataCopy to Clipboard object won't contain other order data. Only the ID of the order. You can retrieve the order information using the orderServiceCopy to Clipboard.

Subscriber ID

The subscribeCopy to Clipboard method of the eventBusServiceCopy to Clipboard accepts a third optional parameter which is a context object. This object has a property subscriberIdCopy to Clipboard with its value being a string. This ID is useful when there is more than one handler method attached to a single event or if you have multiple Medusa backends running. This allows the events bus service to differentiate between handler methods when retrying a failed one. If a subscriber ID is not passed on subscription, all handler methods are run again. This can lead to data inconsistencies or general unwanted behavior in your system. On the other hand, if you want all handler methods to run again when one of them fails, you can omit passing a subscriber ID.

An example of using the subscribe method with the third parameter:

eventBusService.subscribe("order.placed", this.handleOrder, {
subscriberId: "my-unique-subscriber",
})
Report Incorrect CodeCopy to Clipboard

Retrieve Medusa Configurations

Within your subscriber, you may need to access the Medusa configuration exported from medusa-config.jsCopy to Clipboard. To do that, you can access configModuleCopy to Clipboard using dependency injection.

For example:

import { ConfigModule, EventBusService } from "@medusajs/medusa"

type InjectedDependencies = {
eventBusService: EventBusService
configModule: ConfigModule
}

class OrderNotifierSubscriber {
protected readonly configModule_: ConfigModule

constructor({
eventBusService,
configModule,
}: InjectedDependencies) {
this.configModule_ = configModule
eventBusService.subscribe("order.placed", this.handleOrder)
}

// ...
}

export default OrderNotifierSubscriber
Report Incorrect CodeCopy to Clipboard

Using Services in Subscribers

You can access any service through the dependencies injected to your subscriber’s constructor.

For example:

src/subscribers/orderNotifier.ts
class OrderNotifierSubscriber {
constructor({ productService, eventBusService }) {
this.productService = productService

eventBusService.subscribe(
"order.placed",
this.handleOrder
)
}
// ...
}
Report Incorrect CodeCopy to Clipboard

You can then use this.productServiceCopy to Clipboard anywhere in your subscriber’s methods. For example:

src/subscribers/orderNotifier.ts
class OrderNotifierSubscriber {
// ...
handleOrder = async (data) => {
// ...
const product = this.productService.list()
}
}
Report Incorrect CodeCopy to Clipboard

When using attributes defined in the subscriber, such as the productServiceCopy to Clipboard in the example above, you must use an arrow function to declare the method. Otherwise, the attribute will be undefined when used.


See Also

Was this page helpful?