OpenApi 3.0.2.Spec-файл не имеет свойства маршрутизатора - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь построить API, используя OpenApi 3.0.2 для активной документации.Мне удалось создать проверенный spec-файл, и если я извлекаю все «OpenApi» из самого API, все маршруты работают правильно, и у меня нет ошибок (если мне не удалось что-то изменитьжизненно важно при попытке решить эту проблему).

Кроме того, у моих контроллеров действительно есть общие имена контроллеров, которые эта ошибка предлагает мне использовать, поэтому я сначала подумал, что у него возникли проблемы с поиском моих контроллеров.Однако, когда я использовал Swagger 2.0 (до его перекомпоновки с 3.0), у меня не было этой проблемы.

Все мои контроллеры структурированы одинаково, и когда я изменил порядок контроллеров (путь '/«Сначала пользователи»), я нашел ту же ошибку («пользователи» поменялись местами на «одежды» в журнале ошибок).

Тем не менее, я чувствую, что что-то не так в моем "сводя воедино "функционирующий API и действующий spec-файл.

Я некоторое время искал решение этой проблемы, но ничего не нашел.Если этот вопрос был задан и дан ответ ранее, я прошу прощения;пожалуйста, перенаправьте меня.Это мой первый вопрос StackOverflow, поэтому, пожалуйста, будьте осторожны.Если я пропустил любую информацию, важную для вопроса, пожалуйста, сообщите мне.

Ошибка:

outfittr | 2019-01-21T13:51:37.150Z info: Valid specification file
outfittr | 2019-01-21T13:51:37.162Z info: Specification file dereferenced
outfittr | 2019-01-21T13:51:37.210Z info: No localhost or relative server found in spec file, added for testing in Swagger UI
outfittr | 2019-01-21T13:51:37.210Z debug: Register: GET - /garments
outfittr | 2019-01-21T13:51:37.211Z debug:   GET - /garments
outfittr | 2019-01-21T13:51:37.212Z debug:     Spec-file does not have router property -> try generic controller name: garmentsController
outfittr | 2019-01-21T13:51:37.212Z debug:     Controller with generic controller name wasn't found either -> try Default one
outfittr | 2019-01-21T13:51:37.212Z error:     There is no controller for GET - /garments
outfittr exited with code 0

openapi.yaml:

openapi: 3.0.2
info:
  version: "1.0.0"
  title: Outfittr API

paths:

  /swagger:
    x-swagger-pipe: swagger_raw

####################################### Garments ##############################################

  /garments:
    x-router-controller: garmentsController
    get:
      description: Returns an array of garments.
      operationId: indexGarments
      responses:
        "200":
          $ref: '#/components/schemas/Garment'
        default:
          $ref: "#/components/schemas/ErrorResponse"
    post:
      summary: Creates a new garment
      operationId: newGarment
      description: Adds garment to the system
      responses:
        '200':
          $ref: '#/components/schemas/Garment'
        default:
          $ref: "#/components/schemas/ErrorResponse"
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Garment'
        description: User that was created.

  /garments/{_id}:
    x-router-controller: garmentsController
    get:
      description: Returns one garment
      operationId: viewGarment
      parameters:
        - in: path
          name: _id
          schema:
            type: string
          required: true
          description: Numeric ID of the user to get
      responses:
        "200":
          $ref: '#/components/schemas/Garment'
        default:
          $ref: "#/components/schemas/ErrorResponse"


######################################## Users ################################################

  /users:
    x-router-controller: usersController
    get:
      description: Returns an array of users.
      operationId: indexUsers
      responses:
        "200":
          $ref: '#/components/schemas/User'
        default:
          $ref: "#/components/schemas/ErrorResponse"
    post:
      summary: Creates a new user
      operationId: newUser
      description: Adds user to the system
      responses:
        '200':
          $ref: '#/components/schemas/User'
        default:
          $ref: "#/components/schemas/ErrorResponse"
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
        description: User that was created.

  /users/{_id}:
    x-router-controller: usersController
    get:
      description: Returns one user
      operationId: viewUser
      parameters:
        - in: path
          name: _id
          schema:
            type: string
          required: true
          description: Numeric ID of the user to get
      responses:
        "200":
          $ref: '#/components/schemas/User'
        default:
          $ref: "#/components/schemas/ErrorResponse"

####################################### Wardrobe ##############################################

  /wardrobe:
    x-router-controller: wardrobeController
    get:
      description: Returns an array of garments in the user's wardrobe.
      operationId: indexWardrobeItems
      responses:
        "200":
          $ref: '#/components/schemas/WardrobeItem'
        default:
          $ref: "#/components/schemas/ErrorResponse"
    post:
      summary: Creates a new wardrobe item
      operationId: newWardrobeItem
      description: Adds garment to the user's wardrobe in the system
      responses:
        '200':
          $ref: '#/components/schemas/WardrobeItem'
        default:
          $ref: "#/components/schemas/ErrorResponse"
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WardrobeItem'
        description: User that was created.

  /wardrobeItem/{_id}:
    x-router-controller: wardrobeController
    get:
      description: Returns one wardrobe item
      operationId: viewWardrobeItem
      parameters:
        - in: path
          name: _id
          schema:
            type: string
          required: true
          description: Numeric ID of the user to get
      responses:
        "200":
          $ref: '#/components/schemas/WardrobeItem'
        default:
          $ref: "#/components/schemas/ErrorResponse"

###################################### Components #############################################

servers:
  - url: outfittr.net
  - url: localhost:3000
components:
  schemas:
    User:
      type: object
      required:
        - _id
        - email
        - username
        - password
      properties:
        _id:
          type: string
          description: unique ID given by Mongo.
        firstName:
          type: string
          description: First name of the user.
        lastName:
          type: string
          description: Last name of the user.
        email:
          type: string
          description: User's email address.
        username:
          type: string
          description: User's username (for login)
        password:
          type: string
          description: User's password (for login).
        create_date:
          type: string
          description: date that the user joined.
        __v:
          type: integer
          description: I have no idea.

    Garment:
      type: object
      required:
        - _id
        - type
        - imageLink
      properties:
        _id:
          type: string
          description: unique ID given by Mongo.
        type:
          type: string
          description: type of garment
        imageLink:
          type: string
          description: primary color of garment
        __v:
          type: integer
          description: I have no idea.

    WardrobeItem:
      type: object
      required:
        - _id
        - owner_id
        - garment_id
      properties:
        _id:
          type: string
          description: unique ID given by Mongo.
        unavailable:
          type: boolean
          description: Is the wardrobe item dirty, loaned out, or otherwise unavailable?
        owner_id:
          type: string
          description: foreign key linking this wardrobe item to its owner.
        garment_id:
          type: string
          description: foreign key linking this wadrobe item to the garment it is.
        torn:
          type: boolean
          description: Is the wardrobe item torn?
        reserveDate:
          type: string
          description: Optional - a date for which this wardrobe item must be worn
        reserveTilDate:
          type: string
          description: Optional - a date after which the wardrobe item cannot be worn until the reserveDate.
        __v:
          type: integer
          description: I have no idea.

    ErrorResponse:
      required:
        - message
      properties:
        message:
          type: string

Любая помощь чрезвычайнооценили.

1 Ответ

0 голосов
/ 15 мая 2019

Я отвечу на это, даже если уже поздно, потому что у меня была такая же проблема, и я долго искал решение. Если у кого-то есть какие-либо сведения о том, как это исправить.

Когда вы устанавливаете параметр контроллеров в oas-tools:

OasTools.configure({
    controllers: `${__dirname}/controllers`,
    ...
});

Сопоставление по умолчанию, которое oas-tools использует для загрузки файлов: endpoint+Controller.js, в вашем случае oas-tools будет искать функцию экспорта indexGarments в .../controllers/garmentsController.js

Другой пример будет для случая /garments/{_ id}, имя файла контроллера должно быть garments_idController.js

Использование x-router-controller

Если вы хотите использовать параметр x-router-controller, вы должны поместить его в метод:

...
  /garments:
    get:
      x-router-controller: garmentsController
      operationId: indexGarments
      description: Returns an array of garments.
      responses:

Но будьте осторожны , потому что он также изменяет значение параметра (я не знаю, является ли это ошибкой или потому, что имя файла имеет это требование), для Например, если вы настроите x-router-controller со значением garments.resource, файл для поиска будет .../controllers/garmentsresource.js

Если вы установите параметр x-router-controller и файл не будет найден, будет выдана эта ошибка:

info: Valid specification file
info: Specification file dereferenced
debug: Register: GET - /health
debug:   GET - /health
debug:     OAS-doc has x-router-controller property
error: undefined
...