OpenApi 3.0.2。规格文件不具有路由器属性

时间:2019-01-21 14:28:02

标签: node.js api swagger openapi

我正在尝试使用OpenApi 3.0.2构建API以获取有效文档。我设法建立了一个经过验证的规格文件,如果我从API本身中取出所有OpenApi“材料”,则所有路由都可以正常工作,并且我没有任何错误(除非我设法进行了一些更改)解决这个问题至关重要。

此外,我的控制器实际上确实具有该错误提示我使用的通用控制器名称,因此我最初的想法是找不到控制器。但是,当我使用Swagger 2.0(用3.0重建之前)时,我没有这个问题。

我所有的控制器的结构都相似,当我更改控制器的顺序(首先是路径“ /用户”)时,我检索到了相同的错误(错误日志中的“用户”换成了“服装”)。

也就是说,我觉得在将功能API和有效的规范文件“结合在一起”时,我一定做错了。

一段时间以来,我一直在寻找解决此问题的方法,但没有发现任何问题。如果以前曾有人问过并回答过这个问题,我深表歉意。请重定向我。这是我的第一个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

我们非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

即使我来晚了,我也会回答这个问题,因为我遇到了同样的问题,并且很长时间都在寻找解决方案。如果其他人碰巧对如何解决它有任何参考。

在oas-tools中设置controllers参数时:

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

答案 1 :(得分:0)

对于OAS3,您可以尝试以下操作:

paths:
  /users:
    get:
      tags:
        - User
      
      x-openapi-router-controller: usersController
      description: Returns an array of users.
      operationId: indexUsers
      responses:
        "200":
          $ref: '#/components/schemas/User'