open api error: request should have required property '.headers' - docker
open api error: request should have required property '.headers' - docker
我的 nodejs 应用有一个 open-api.yaml 文件和 express-openapi-validate 验证器。我正在执行一个正在运行的 POST 请求,并且 api 验证器没有 return 任何错误:
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
...
然后我尝试 docker 调整我的应用程序 - 创建了一个 docker 容器,并 运行 它与 pm2-runtime 一起放在里面。但是,当应用程序在其中 运行 时,当我向 docker 容器发送相同的请求时,我得到 error while validating request: request should have required property '.headers'
。我在 open-api.yaml 文件中没有提到 属性 '.headers'。
我尝试删除验证器中间件,请求顺利通过。你能帮我理解验证者在抱怨什么吗?
编辑:
我设法找到错误 object:
{
"data": [
{
"dataPath": "",
"keyword": "required",
"message": "should have required property '.headers'",
"params": {
"missingProperty": ".headers"
},
"schemaPath": "#/required"
}
],
"name": "ValidationError",
"statusCode": 400
}
不用说我没有要求 headers 属性...
如果其他人来这里解决此问题,以备将来参考:
我终于找到了问题所在:我在我的 Dockerfile 中使用了 FROM node:alpine
,它表示最新版本的节点。但是,我的应用程序在节点 10.18.1
上 运行
我改成FROM:node:10.18.1-alpine
后问题就解决了。
显然,express-openapi-validate 插件在最新的节点模块中存在一些问题,或者看起来是这样。
可能有点晚了,但希望对其他人有用。
问题与这段代码有关(这是编译后的版本)
...
const reqToValidate = Object.assign({}, req, { cookies: req.cookies
? Object.assign({}, req.cookies, req.signedCookies) : undefined });
const valid = validator(reqToValidate);
...
在 OpenApiValidator 上以及 Express req
object 使用访问器 get/set 作为 headers 的事实,因此 Object.assign 不会传播 headers 信息,因此 validator
函数将找不到所需的 headers 属性,只有 rawHeaders 可用。
作为快速修复,我实施了以下操作:
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);
};
适应 Express 请求并传播有关 headers 的所有必需信息。
对于 <= 14 的所有节点版本和 <= 3 的 express-openapi-validator 版本,我都有相同的设置。
无法让验证器使用节点版本 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)
变成 (v4):
const validator = OpenApiValidator.middleware({
apiSpec: 'src/openapi.yaml'
})
app.use(validator)
代码最初由https://hub.docker.com/r/openapitools/openapi-generator-cli
生成
我的 nodejs 应用有一个 open-api.yaml 文件和 express-openapi-validate 验证器。我正在执行一个正在运行的 POST 请求,并且 api 验证器没有 return 任何错误:
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
...
然后我尝试 docker 调整我的应用程序 - 创建了一个 docker 容器,并 运行 它与 pm2-runtime 一起放在里面。但是,当应用程序在其中 运行 时,当我向 docker 容器发送相同的请求时,我得到 error while validating request: request should have required property '.headers'
。我在 open-api.yaml 文件中没有提到 属性 '.headers'。
我尝试删除验证器中间件,请求顺利通过。你能帮我理解验证者在抱怨什么吗?
编辑:
我设法找到错误 object:
{
"data": [
{
"dataPath": "",
"keyword": "required",
"message": "should have required property '.headers'",
"params": {
"missingProperty": ".headers"
},
"schemaPath": "#/required"
}
],
"name": "ValidationError",
"statusCode": 400
}
不用说我没有要求 headers 属性...
如果其他人来这里解决此问题,以备将来参考:
我终于找到了问题所在:我在我的 Dockerfile 中使用了 FROM node:alpine
,它表示最新版本的节点。但是,我的应用程序在节点 10.18.1
我改成FROM:node:10.18.1-alpine
后问题就解决了。
显然,express-openapi-validate 插件在最新的节点模块中存在一些问题,或者看起来是这样。
可能有点晚了,但希望对其他人有用。
问题与这段代码有关(这是编译后的版本)
...
const reqToValidate = Object.assign({}, req, { cookies: req.cookies
? Object.assign({}, req.cookies, req.signedCookies) : undefined });
const valid = validator(reqToValidate);
...
在 OpenApiValidator 上以及 Express req
object 使用访问器 get/set 作为 headers 的事实,因此 Object.assign 不会传播 headers 信息,因此 validator
函数将找不到所需的 headers 属性,只有 rawHeaders 可用。
作为快速修复,我实施了以下操作:
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);
};
适应 Express 请求并传播有关 headers 的所有必需信息。
对于 <= 14 的所有节点版本和 <= 3 的 express-openapi-validator 版本,我都有相同的设置。
无法让验证器使用节点版本 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)
变成 (v4):
const validator = OpenApiValidator.middleware({
apiSpec: 'src/openapi.yaml'
})
app.use(validator)
代码最初由https://hub.docker.com/r/openapitools/openapi-generator-cli
生成