我的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属性。。。
如果其他人因为这个问题来到这里,以供将来参考:
我终于发现了问题:我在我的 Dockerfile 中使用了 FROM 节点:高山
,这表示节点的最新版本。但是,我的应用程序在节点 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);
...
在 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);
};
其适应快速请求并传播关于报头的所有所需信息。
我对所有节点版本都有相同的
不可能让验证器与节点版本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