node.js - NestJS/Swagger שגיאה TS2307: לא ניתן למצוא את המודול '@nestjs/swagger'


אני מנסה להוסיף Swagger לאפליקציית NestJS שלי, אך אני ממשיך לקבל שגיאה שאין ניתן למצוא את המודול. השתמשתי ב-npm install --save @nestjs/swagger swagger-ui-express כדי להוסיף אותו לקובץ package.json. שים לב שגם אני משתמש ב-Docker עם docker-compose.

קובץ main.ts:

import { NestFactory } from '@nestjs/core';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const whitelistOrigins = process.env.ALLOWED_CORS_ORIGIN;
  app.enableCors({
    origin: (origin, callback) => {
      if (whitelistOrigins.indexOf(origin) !== -1) {
        callback(null, true);
      } else {
        callback(null, false);
      }
    },
    optionsSuccessStatus: 200,
  });


  const options = new DocumentBuilder()
    .setTitle('App')
    .setDescription('The App API;')
    .setVersion('1.0')
    .addTag('app')
    .build();
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup('api', app, document);

  await app.listen(process.env.PORT);
}
bootstrap();

קובץ package.json:

"dependencies": {
    "@nestjs/common": "^6.3.1",
    "@nestjs/core": "^6.3.1",
    "@nestjs/jwt": "^6.1.1",
    "@nestjs/mongoose": "^6.1.2",
    "@nestjs/passport": "^6.1.0",
    "@nestjs/platform-express": "^6.3.2",
    "@nestjs/platform-socket.io": "^6.3.2",
    "@nestjs/swagger": "^3.1.0",
    "@nestjs/websockets": "^6.3.1",
    "bcrypt": "^3.0.6",
    "cache-manager": "^2.9.1",
    "cache-manager-redis-store": "^1.5.0",
    "dotenv": "^8.0.0",
    "google-auth-library": "^4.2.2",
    "helmet": "^3.21.1",
    "joi": "^14.3.1",
    "lodash": "^4.17.11",
    "moment": "^2.24.0",
    "mongoose": "^5.6.0",
    "nest-access-control": "^2.0.1",
    "nest-schedule": "^0.6.0",
    "passport": "^0.4.0",
    "passport-http-bearer": "^1.0.1",
    "passport-jwt": "^4.0.0",
    "reflect-metadata": "^0.1.13",
    "rimraf": "^2.6.3",
    "rxjs": "^6.5.2",
    "socket.io-redis": "^5.2.0",
    "swagger-ui-express": "^4.1.2",
    "typescript": "^3.5.2"
  },
  "devDependencies": {
    "@nestjs/testing": "^6.3.1",
    "@types/express": "^4.17.0",
    "@types/jest": "^24.0.15",
    "@types/node": "^12.0.8",
    "@types/supertest": "^2.0.7",
    "jest": "^24.8.0",
    "nodemon": "^1.19.1",
    "prettier": "^1.18.2",
    "supertest": "^4.0.2",
    "ts-jest": "^24.0.2",
    "ts-loader": "^6.0.3",
    "ts-node": "^8.3.0",
    "tsconfig-paths": "^3.8.0",
    "tslint": "5.17.0"
  },

קובץ tsconfig.json:

{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es6",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "moduleResolution": "node"
  },
}

אני ממשיך לקבל את השגיאה הבאה בזמן הרצת האפליקציה באמצעות npm run start:dev ו-npm run start:prod:

/home/node/app/node_modules/ts-node/src/index.ts:293
     return new TSError(diagnosticText, diagnosticCodes)
            ^
 TSError: ⨯ Unable to compile TypeScript:
 src/main.ts(4,48): error TS2307: Cannot find module '@nestjs/swagger'.

     at createTSError (/home/node/app/node_modules/ts-node/src/index.ts:293:12)
     at reportTSError (/home/node/app/node_modules/ts-node/src/index.ts:297:19)
     at getOutput (/home/node/app/node_modules/ts-node/src/index.ts:399:34)
     at Object.compile (/home/node/app/node_modules/ts-node/src/index.ts:457:32)
     at Module.m._compile (/home/node/app/node_modules/ts-node/src/index.ts:530:43)
     at Module._extensions..js (internal/modules/cjs/loader.js:789:10)
     at Object.require.extensions.(anonymous function) [as .ts] (/home/node/app/node_modules/ts-node/src/index.ts:533:12)
     at Module.load (internal/modules/cjs/loader.js:653:32)
     at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
     at Function.Module._load (internal/modules/cjs/loader.js:585:3)
 [nodemon] app crashed - waiting for file changes before starting...

קובץ docker-compose.yml:

version: "2"
services:
  node:
    build: 
      context: .
      dockerfile: ./docker/node/Dockerfile
    user: "node"
    working_dir: /home/node/app
    environment:
      - NODE_ENV=development
    volumes:
      - ./:/home/node/app
      - /home/node/app/node_modules/
    expose:
      - "8081"
    command: "npm run start:dev"
    ports:
      - "8000:8000"
    depends_on:
      - mongo
      - redis
  mongo:
    image: mongo
    ports:
      - "27018:27017"
    volumes:
      - data-volume:/data/db
  redis:
    image: redis
    ports:
      - "6379:6379"
  mongoclient:
    image: mongoclient/mongoclient:2.2.0
    depends_on:
      - mongo
    ports:
      - 3300:3000
volumes:
  data-volume:

/docker/node/Dockerfile:

FROM node:10

WORKDIR /home/node/app
COPY ./package.json ./

RUN npm install nodemon -g
RUN npm install

שגיאה זו מתקבלת בעת שימוש ב-nodemon.

תשובה #1

התקנתי את @nestjs/swagger בהצלחה אבל אני מקבל את השגיאה הזו: "שגיאה TS2307: לא ניתן למצוא את המודול '@nestjs/swagger' או את הצהרות הסוג המתאימות שלו."

הוספתי "@nestjs/swagger": "^5.2.1" ב-package.json והרצתי yarn. פתרתי את הבעיה שלי

תשובה #2

לפעמים בניית הדוקר מתנהגת בצורה מוזרה ולא נבנית כראוי. בצע בנייה מחדש של הפרויקט הראשי ונסה שוב. אני משתמש במסגרת NestJS (expressJS) ונתקלתי בבעיה דומה אבל נפתרה באמצעות הגישה הזו. מודולים אחרים נתקלו בבעיה זהה והם נפתרו בדרך זו גם כן. עם Swagger ^6.0.5.