打开 api 错误:请求应该具有必需的属性“.headers” - docker

m14*_*144 8 node.js docker pm2 openapi

我的nodejs应用程序有一个open-api.yaml文件和express-openapi-validate验证器。我正在执行一个正在运行的 POST 请求,并且 api 验证器不会返回任何错误:

curl --request POST 'http://localhost:33004/my-app/settings' --data-raw '{"serials":["1234","2355"]}' -H 'Content-Type: application/json'
Run Code Online (Sandbox Code Playgroud)

在我的 open-api.yaml 中,我有:

openapi: '3.0.0'
servers:
 - url: 'http://{host}/my-app'
   variables:
     host:
     enum:
       - 'localhost'
       ....
...
paths:
    /settings:
      ...
      post:
        tags:
          - 'settings'
        operationId: 'postSettings'
        requestBody:
          content:
            application/json:
              schema:
                type: object
                properties:
                  serials:
                    type: array
                    items:
                      type: string
...
Run Code Online (Sandbox Code Playgroud)

然后我尝试对我的应用程序进行 docker 化 - 创建一个 docker 容器,并使用 pm2-runtime 在内部运行它。但是,当我在应用程序在其中运行时向 docker 容器发送相同的请求时,我得到error while validating request: request should have required property '.headers'. 我在 open-api.yaml 文件中没有提到属性“.headers”。

我尝试删除验证器中间件,并且请求顺利完成。你能帮我理解验证者在抱怨什么吗?

编辑:

我设法找到错误对象:

{
  "data": [
    {
      "dataPath": "",
      "keyword": "required",
      "message": "should have required property '.headers'",
      "params": {
        "missingProperty": ".headers"
      },
      "schemaPath": "#/required"
    }
  ],
  "name": "ValidationError",
  "statusCode": 400
}
Run Code Online (Sandbox Code Playgroud)

不用说我没有必需的 headers 属性......

Ben*_*jam 7

我对所有节点版本 <= 14 和 express-openapi-validator 版本 <= 3 都有相同的设置。

验证器不可能与节点版本 16 一起工作,因此我们只能使用旧的开发版本。

解决方案是迁移到express-openapi-validator v4。

此处解释了迁移https://github.com/cdimascio/express-openapi-validator#upgrading-from-3x

这个(v3):

const validator = new OpenApiValidator({
  apiSpec: openApiYaml,
  operationHandlers: __dirname
})
app.use(validator)
Run Code Online (Sandbox Code Playgroud)

变为(v4):

const validator = OpenApiValidator.middleware({
  apiSpec: 'src/openapi.yaml'
})
app.use(validator)
Run Code Online (Sandbox Code Playgroud)

该代码最初由https://hub.docker.com/r/openapitools/openapi-generator-cli生成


m14*_*144 1

如果其他人来这里解决这个问题,供将来参考:

我终于找到了问题:我FROM node:alpine在我的Dockerfile中使用了它,它指示了最新版本的node。但是,我的应用程序运行在节点 10.18.1 上

一旦我更改了,FROM:node:10.18.1-alpine问题就解决了。

显然,express-openapi-validate插件在最新的节点模块中存在一些问题,至少看起来是这样。