当前位置: 首页 > 知识库问答 >
问题:

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

唐兴发
2023-03-14

我的nodejs应用程序有一个开放api。yaml文件和ExpressOpenAPI验证验证器。我正在做一个POST请求,它正在工作,api验证程序没有返回任何错误:

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

在我的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
...

然后我尝试对我的应用程序进行dockerized-创建了一个docker容器,并在pm2-runtime中运行它。但是,当应用程序在docker容器中运行时,我向它发送相同的请求时,在验证请求时出现了错误:请求应该具有必需的属性“. Headers”。我没有在open-api.yaml文件中提到的属性“. Headers”。

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

编辑:

我设法找到了错误对象:

{
  "data": [
    {
      "dataPath": "",
      "keyword": "required",
      "message": "should have required property '.headers'",
      "params": {
        "missingProperty": ".headers"
      },
      "schemaPath": "#/required"
    }
  ],
  "name": "ValidationError",
  "statusCode": 400
}

不用说,我没有必要的headers属性。。。

共有3个答案

臧翰采
2023-03-14

如果其他人因为这个问题来到这里,以供将来参考:

我终于发现了问题:我在我的 Dockerfile 中使用了 FROM 节点:高山,这表示节点的最新版本。但是,我的应用程序在节点 10.18.1 上运行

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

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

聂涛
2023-03-14

可能有点晚,但希望对其他人有用。

问题与此代码有关(这是编译版本)

...
const reqToValidate = Object.assign({}, req, { cookies: req.cookies
                    ? Object.assign({}, req.cookies, req.signedCookies) : undefined });
const valid = validator(reqToValidate);
...

在 OpenApi 验证码上,以及 Express req 对象使用访问器获取/设置标头的事实,结果 Object.assign 不会传播标头信息,并且验证程序函数不会找到所需的标头属性,只有 rawHeader 可用。

作为快速修复,我实现了以下内容:

const validator = this.openApiValidator.validate(method, path);
return (req, res, next) => {
    const reqToValidate = Object.assign({}, req, {
        cookies: req.cookies
            ? Object.assign({}, req.cookies, req.signedCookies) : undefined
    });
   
    if (!reqToValidate.hasOwnProperty('headers')) {
        reqToValidate.headers = req.headers;
    }
    return validator(reqToValidate, res, next);
};

其适应快速请求并传播关于报头的所有所需信息。

董奇思
2023-03-14

我对所有节点版本都有相同的

不可能让验证器与节点版本16一起工作,因此我们被困在旧的开发版本上。

解决方案是迁移到ExpressOpenAPI验证程序v4。

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

这(v3):

const validator = new OpenApiValidator({
  apiSpec: openApiYaml,
  operationHandlers: __dirname
})
app.use(validator)

变成(v4):

const validator = OpenApiValidator.middleware({
  apiSpec: 'src/openapi.yaml'
})
app.use(validator)

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

 类似资料:
  • 我正在我的应用程序中构建一个新的endpoint,它使用作为验证器中间件。 在我的配置 () 文件中,我已将终结点的架构定义为: 我已经使用以下JSON正文使用Postman进行了测试: 但收到以下错误消息: 我不知道它为什么抱怨。我试着在中的配置下放入,但这并没有改变任何事情。我只是想确保body包含所需的字段。

  • 问题内容: 我正在尝试在Python中获取url参数。 我正在使用此代码: 但我收到此错误: 问题答案: 你想request.args在Flask中使用GET参数。 要访问通过URL(?key = value)提交的参数,可以使用args属性:

  • 问题内容: 在我的Web应用程序中,我对表单字段使用了一些自定义验证。在同一个表单中,我有两个按钮:一个用于实际提交表单,另一个用于取消/重置表单。 通常,我使用Safari作为默认浏览器。现在Safari5退出了,突然我的“取消/重置”按钮不再起作用了。每次按下重置按钮时,表单中的第一个字段都会获得焦点。但是,这与我的自定义表单验证相同。在其他浏览器上尝试时,一切都很好。我必须是Safari 5

  • 我正在获取一条消息,通过gmail API获取完整消息: 我正在传递一条有效的消息。Id号 谷歌。GoogleApiException:“谷歌。API。请求。请求错误 找不到[404] 谷歌。应用程序。请求。请求错误未找到[404]错误[消息[未找到]位置[-]原因[未找到]域[全局]] 这里还有一个问题 有人遇到过这个吗?

  • 我正在将一个Eclipse Maven管理的webapp项目转变为一个多模块Maven项目(这是一个用Maven进行实验的测试项目,因此可以随意提供任何种类的建议)。 单个项目webapp不能有任何错误,成功编译并在部署时正确运行,所以我从一个正常工作的应用程序开始。 该应用程序有一个web部件和一个控制台部件,这意味着有些类具有<code>main() 所以,这就是我如何拆分项目: 核心(包含其

  • 我创建了一个简单的SpringBootREST服务来处理HTML页面中的发布数据。当我发布数据时,一切正常,但当我想检查@RequestMapping value href上的数据时,我看到错误消息: 白标错误页 此应用程序没有/error的显式映射,因此您将其视为回退。 周三11月15 13:33:46CET 2017有一个意外的错误(类型=坏请求,状态=400)。缺少所需的请求正文:公共org