Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Global module initialization order bug #14117

Closed
3 of 15 tasks
wenlong-chen opened this issue Nov 8, 2024 · 1 comment
Closed
3 of 15 tasks

Global module initialization order bug #14117

wenlong-chen opened this issue Nov 8, 2024 · 1 comment
Labels
needs triage This issue has not been looked into

Comments

@wenlong-chen
Copy link
Contributor

Is there an existing issue for this?

  • I have searched the existing issues

Current behavior

AModule depends on BModule, which is a global module. BService’s onModuleInit is called after AService’s onModuleInit.

Minimum reproduction code

/~https://github.com/wenlong-chen/nest-on-module-init-bug

Steps to reproduce

The following code’s onModuleInit method in AService is expected not to throw an error, but it actually does.

import { Global, Injectable, Module, OnModuleInit } from "@nestjs/common";

@Injectable()
export class BService implements OnModuleInit {
  public initialized = false;

  onModuleInit() {
    this.initialized = true;
  }
}

@Global()
@Module({
  providers: [BService],
  exports: [BService],
})
export class BModule {}

@Injectable()
export class AService implements OnModuleInit {
  constructor(private bService: BService) {}

  onModuleInit() {
    if (!this.bService.initialized) {
      throw new Error('BService not initialized before AService');
    }
  }
}

@Module({
  providers: [AService],
  exports: [AService]
})
export class AModule {}

@Module({
  imports: [AModule, BModule],
})
export class AppModule {}

Expected behavior

AModule depends on BModule, which is a global module. BService’s onModuleInit should be called before AService’s onModuleInit.

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

No response

NestJS version

No response

Packages versions

{
  "name": "nest-on-module-init-bug",
  "version": "0.0.1",
  "description": "",
  "author": "",
  "private": true,
  "license": "UNLICENSED",
  "scripts": {
    "build": "nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json"
  },
  "dependencies": {
    "@nestjs/common": "^10.0.0",
    "@nestjs/core": "^10.0.0",
    "@nestjs/platform-express": "^10.0.0",
    "reflect-metadata": "^0.2.0",
    "rxjs": "^7.8.1"
  },
  "devDependencies": {
    "@nestjs/cli": "^10.0.0",
    "@nestjs/schematics": "^10.0.0",
    "@nestjs/testing": "^10.0.0",
    "@types/express": "^4.17.17",
    "@types/jest": "^29.5.2",
    "@types/node": "^20.3.1",
    "@types/supertest": "^6.0.0",
    "@typescript-eslint/eslint-plugin": "^8.0.0",
    "@typescript-eslint/parser": "^8.0.0",
    "eslint": "^8.42.0",
    "eslint-config-prettier": "^9.0.0",
    "eslint-plugin-prettier": "^5.0.0",
    "jest": "^29.5.0",
    "prettier": "^3.0.0",
    "source-map-support": "^0.5.21",
    "supertest": "^7.0.0",
    "ts-jest": "^29.1.0",
    "ts-loader": "^9.4.3",
    "ts-node": "^10.9.1",
    "tsconfig-paths": "^4.2.0",
    "typescript": "^5.1.3"
  },
  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "testRegex": ".*\\.spec\\.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "../coverage",
    "testEnvironment": "node"
  }
}

Node.js version

20.17.0

In which operating systems have you tested?

  • macOS
  • Windows
  • Linux

Other

No response

@wenlong-chen wenlong-chen added the needs triage This issue has not been looked into label Nov 8, 2024
@kamilmysliwiec
Copy link
Member

Let's track this here #14110

@nestjs nestjs locked and limited conversation to collaborators Nov 8, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
needs triage This issue has not been looked into
Projects
None yet
Development

No branches or pull requests

2 participants