moleculerjs / moleculer-channels

Reliable messages for Moleculer services via external queue/channel/topic.
MIT License
72 stars 15 forks source link

How to dynamically add middleware within code? #60

Closed ujwal-setlur closed 1 year ago

ujwal-setlur commented 1 year ago

I want to add this middleware dynamically instead of defining it in the config. I usually add all my middleware with

broker.middlewares.add(...);

However, this does not work with channels middleware. This is what I tried:

const ChannelMiddleware = require('@moleculer/channels).Middleware;

broker.middlewares.add(ChannelMiddleware({adapter: 'Fake'}));

However, this doesn't work. I get runtime errors.

What's the correct way to do it?

icebob commented 1 year ago

please show the errors as well.

ujwal-setlur commented 1 year ago

@icebob here is the code that generates the error:

const { ServiceBroker } = require('moleculer');
const ChannelMiddleware = require('@moleculer/channels').Middleware;

const main = async () => {
  // service schema
  const serviceSchema = {
    name: 'helper',

    channels: {
      async 'helper.sum'(payload) {
        // Calls the sum method
        return this.sum(payload.a, payload.b);
      },
    },

    methods: {
      sum(a, b) {
        return a + b;
      },
    },
  };

  // our channel middleware
  const mw = ChannelMiddleware({
    adapter: {
      type: 'Fake',
    },
  });

  // create broker
  let broker = new ServiceBroker({
    logger: {
      type: 'Console',
    },
    // middlewares: [mw], // If I add middleware here, it works!
  });

  broker.middlewares.add(mw); // If I add middleware here, it does not work!

  broker.createService(serviceSchema);

  await broker.start();

  await broker.stop();
};

main();

Here is the error:

node index.js
[2023-01-31T19:04:19.622Z] INFO  triloka-81500/BROKER: Moleculer v0.14.28 is starting...
[2023-01-31T19:04:19.623Z] INFO  triloka-81500/BROKER: Namespace: <not defined>
[2023-01-31T19:04:19.623Z] INFO  triloka-81500/BROKER: Node ID: triloka-81500
[2023-01-31T19:04:19.623Z] INFO  triloka-81500/REGISTRY: Strategy: RoundRobinStrategy
[2023-01-31T19:04:19.623Z] INFO  triloka-81500/REGISTRY: Discoverer: LocalDiscoverer
[2023-01-31T19:04:19.624Z] INFO  triloka-81500/BROKER: Serializer: JSONSerializer
[2023-01-31T19:04:19.626Z] INFO  triloka-81500/BROKER: Validator: FastestValidator
[2023-01-31T19:04:19.627Z] INFO  triloka-81500/BROKER: Registered 13 middleware(s).
[2023-01-31T19:04:19.633Z] INFO  triloka-81500/REGISTRY: '$node' service is registered.
[2023-01-31T19:04:19.634Z] INFO  triloka-81500/REGISTRY: 'helper' service is registered.
[2023-01-31T19:04:19.634Z] INFO  triloka-81500/$NODE: Service '$node' started.
[2023-01-31T19:04:19.634Z] INFO  triloka-81500/HELPER: Service 'helper' started.
/Users/ujwal/Projects/moleculer-channels-issue-60/node_modules/@moleculer/channels/src/index.js:210
                                await broker.Promise.mapSeries(
                                             ^

TypeError: Cannot read properties of undefined (reading 'Promise')
    at ServiceBroker.serviceCreated (/Users/ujwal/Projects/moleculer-channels-issue-60/node_modules/@moleculer/channels/src/index.js:210:18)
    at /Users/ujwal/Projects/moleculer-channels-issue-60/node_modules/moleculer/src/middleware.js:111:29
    at Array.map (<anonymous>)
    at MiddlewareHandler.callSyncHandlers (/Users/ujwal/Projects/moleculer-channels-issue-60/node_modules/moleculer/src/middleware.js:111:16)
    at ServiceBroker.callMiddlewareHookSync (/Users/ujwal/Projects/moleculer-channels-issue-60/node_modules/moleculer/src/service-broker.js:679:27)
    at Service._init (/Users/ujwal/Projects/moleculer-channels-issue-60/node_modules/moleculer/src/service.js:271:15)
    at Service.parseServiceSchema (/Users/ujwal/Projects/moleculer-channels-issue-60/node_modules/moleculer/src/service.js:239:8)
    at new Service (/Users/ujwal/Projects/moleculer-channels-issue-60/node_modules/moleculer/src/service.js:64:20)
    at ServiceBroker.createService (/Users/ujwal/Projects/moleculer-channels-issue-60/node_modules/moleculer/src/service-broker.js:834:14)
    at main (/Users/ujwal/Projects/moleculer-channels-issue-60/index.js:50:10)

Node.js v18.13.0
icebob commented 1 year ago

Yeah this form won't work. The middleware uses the created hook to get the broker instance and initialize the middleware, but you add the middleware after the broker created so this hook is not called. It's a little hacky, but you can try to call mw.created(broker); before adding.

ujwal-setlur commented 1 year ago

Ok, no worries. I put it in the configuration