OpenAPI:"request should have required property 'body'"

OpenAPI: "request should have required property 'body'"

我正在我的应用程序中构建一个新端点,它使用 express-openapi-validator 作为验证器中间件。

/* index.ts */

import * as OpenApiValidator from 'express-openapi-validator';

const whitelistedPaths = [/* regex tested paths */];

app.use(
    OpenApiValidator.middleware({
      apiSpec: './schema/api.json',
      validateResponses: true,
      ignorePaths: whitelistedPaths,
      validateSecurity: true,
    }),
  );

/* ... */

app.post(
  '/users/:email/validateToken',
  bodyParser.json(),
  (req) => validateToken(req.params.email, req.body.resetToken),
);

在我的配置 (api.json) 文件中,我将端点的模式定义为:

    "/users/{email}/validateToken": {
      "post": {
        "tags": ["users"],
        "summary": "Validate user token",
        "operationId": "validateToken",
        "responses": {
          "200": {
            "description": "Ok",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "parameters": [
          {
            "name": "email",
            "in": "path",
            "description": "User email",
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["resetToken"],
                "properties": {
                  "resetToken": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      }
    },

我已经使用以下 JSON 正文对 Postman 进行了测试:

{
  "resetToken": "randomd9320ru9"
}

但收到以下错误消息:

{
    "message": "request should have required property 'body'",
    "errors": [
        {
            "path": ".body",
            "message": "should have required property 'body'",
            "errorCode": "required.openapi.validation"
        }
    ]
}

我不确定它为什么抱怨 body。我尝试将 "required": true 置于 api.json 中的 requestBody 配置下,但这并没有改变任何东西。我只想确保正文包含必填字段 resetToken.

我想你需要在使用 OpenApiValidator.middleware 之前使用 bodyParser.json():

app.use(bodyParser.json());
app.use(
    OpenApiValidator.middleware({
      apiSpec: './schema/api.json',
      validateRequests: true,
      validateResponses: true,
      ignorePaths: whitelistedPaths,
      validateSecurity: true,
    }),
  );
...
app.post(
  '/users/:email/validateToken',
  (req) => validateToken(req.params.email, req.body.resetToken),
);