Skip to content

@nest/cqrs v11 broke sloppy use of EventsHandler decorator & needs compiling check and more informative error #14823

@boan-anbo

Description

@boan-anbo

Is there an existing issue for this?

  • I have searched the existing issues

Current behavior

  • Used to build and run without any issue before v11.

  • After upgrading to v11, when nest start

/app/node_modules/@nestjs/cqrs/dist/decorators/events-handler.decorator.js:22
        if (typeof last !== 'function' && 'scope' in last) {
                                                  ^

TypeError: Cannot use 'in' operator to search for 'scope' in undefined
    at /app/node_modules/@nestjs/cqrs/dist/decorators/events-handler.decorator.js:22:51
    at DecorateConstructor (/app/node_modules/reflect-metadata/Reflect.js:549:33)
    at Reflect.decorate (/app/node_modules/reflect-metadata/Reflect.js:143:24)
    at name (/app/src/domains/system/events/handlers/domain-events-to-gateway-forwarder.ts:4:31)
    at Object.<anonymous> (/app/src/domains/system/events/handlers/domain-events-to-gateway-forwarder.ts:29:1)
    at Module._compile (node:internal/modules/cjs/loader:1546:14)
    at Object..js (node:internal/modules/cjs/loader:1689:10)
    at Module.load (node:internal/modules/cjs/loader:1318:32)
    at Function._load (node:internal/modules/cjs/loader:1128:12)
    at TracingChannel.traceSync (node:diagnostics_channel:315:14)

Node.js v22.10.0
  • After investigation, we found one sloppy use of Handler which caused the issue. Giving it parameters fixed the issue.
@EventsHandler()
export class EventGatewayForwarderHandler 

Minimum reproduction code

no need for reproduction

Steps to reproduce

  1. Use @EventsHandler() without providing any parameters.

Expected behavior

This should throw an error because it expects parameters.

export declare const EventsHandler: (...events: (IEvent | (new (...args: any[]) => IEvent) | InjectableOptions)[]) => ClassDecorator;

However,

  1. before @nestjs/cqrs v11, empty Handler decorators were not punished.

  2. And failing to provide parameter to the decorator does not trigger any compiler or tsc error until the run time under v11.

  3. The error message is helpful to some extend, pointing only to issue with events-handler.decorator.js:22 and domain-events-to-gateway-forwarder.ts:4:31.

So, I hope the EventsHandler decorator can check parameters during compile time or/and throw a more informative error pointing to the missing parameters.

Package

  • I don't know. Or some 3rd-party package
  • @nestjs/common
  • @nestjs/core
  • @nestjs/microservices
  • @nestjs/platform-express
  • @nestjs/platform-fastify
  • @nestjs/platform-socket.io
  • @nestjs/platform-ws
  • @nestjs/testing
  • @nestjs/websockets
  • Other (see below)

Other package

@nestjs/cqrs

NestJS version

^11

Packages versions

    "@nestjs/cqrs": "^11.0.2",

Node.js version

22

In which operating systems have you tested?

  • macOS
  • Windows
  • Linux

Other

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs triageThis issue has not been looked into

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions