4

我有一个这样的 openapi 模式定义:

openapi: 3.0.0
    info:
      title: Manual Handling
      description: API documentation for manual handling.
      version: 0.1.9
    servers:
      - url: /
        description: Self
      - url: http://localhost:3010
        description: local
      - url: https://zz.zzz.in
        description: Development server
    paths:
     /api/v1/meeting/{meetingId}:
        get:
          description: Get meeting details by meeting id
          summary: Get meeting details by meeting id
          tags:
            - Meeting
          parameters:
            - name: meetingId
              in: path
              required: true
              description: Meeting id
              schema:
                $ref: '#/components/parameters/MeetingId'
          responses:
            '200':
              description: Meeting token obtained successfully
              content:
                application/json:
                  schema:
                    $ref: '#/components/parameters/MeetingId'
          security:
            - bearerAuth: []
    components:
      securitySchemes:
        bearerAuth:
          type: http
          scheme: bearer
          bearerFormat: JWT
      parameters:
        MeetingId:
          name: meetingId
          description: Meeting id of the session
          required: true
          in: path
          example: 01701deb-34cb-46c2-972d-6eeea3850342
          schema:
            type: string

并为请求启用验证器

new OpenApiValidator({
    apiSpec: spec,
    validateRequests: true,
}).installSync(app);

并称为 /api/v1/meeting/{meetingId}api。它不会进行验证,而是会引发错误

ERROR:  TypeError: Cannot read property 'schema' of undefined
    at dereferenceSchema (/Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express-openapi-validator/dist/middlewares/parsers/util.js:47:24)
    at Object.normalizeParameter (/Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express-openapi-validator/dist/middlewares/parsers/util.js:23:18)
    at /Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express-openapi-validator/dist/middlewares/parsers/schema.parse.js:32:45
    at Array.forEach (<anonymous>)
    at ParametersSchemaParser.parse (/Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express-openapi-validator/dist/middlewares/parsers/schema.parse.js:28:20)
    at RequestValidator.buildMiddleware (/Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express-openapi-validator/dist/middlewares/openapi.request.validator.js:57:41)
    at RequestValidator.validate (/Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express-openapi-validator/dist/middlewares/openapi.request.validator.js:48:37)
    at requestValidationHandler (/Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express-openapi-validator/dist/index.js:158:79)
    at Layer.handle [as handle_request] (/Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express/lib/router/index.js:317:13)
    at /Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express/lib/router/index.js:275:10)
    at /Users/nikhilcm/nikhil/projects/manual_handling_backend/node_modules/express-openapi-validator/dist/middlewares/openapi.security.js:59:17

该文档在 swagger 编辑器中进行了验证,没有显示错误。在他们的github 页面中也提出了这个问题。

4

1 回答 1

2

问题在这里:

      parameters:
        - name: meetingId
          in: path
          required: true
          description: Meeting id
          schema:
            $ref: '#/components/parameters/MeetingId'   # <-------

schema只能引用模式组件(即#/components/schemas/...),不能引用参数(即#/components/parameters/...)。参数组件应该从参数列表中引用。

将此部分替换为

1)

      parameters:
        - $ref: '#/components/parameters/MeetingId'

或者


      parameters:
        - name: meetingId
          in: path
          required: true
          description: Meeting id of the session
          example: 01701deb-34cb-46c2-972d-6eeea3850342
          schema:
            type: string

components/parameters在这种情况下,还要从该部分中删除(未使用的)参数定义。

于 2020-06-23T07:52:01.110 回答