Swagger Nodejs - 响应验证失败
Swagger Nodejs - Response Validation Failed
我正在使用 Swagger 和 NodeJS 构建 API,到目前为止我遇到的烦人的问题是 Swagger 验证响应,它并不总是顺利。
我的情况:
在文件 .yaml 中:我用 Swagger Editor 检查了 yaml 语法 => 文件 Yaml 是正确的。
/user/createNew:
x-swagger-router-controller: xxxxxxx
post:
tags:
- User
summary: Create New User
# used as the method name of the controller
operationId: createNewUser
parameters:
- name: NewUserReq
in: body
required: true
description: Email register
schema:
$ref: "#/definitions/NewUserReq"
responses:
"201":
description: Successful
schema:
# a pointer to a definition
$ref: "#/definitions/CreateUserResp"
# responses may fall through to errors
default:
description: Error
schema:
$ref: "#/definitions/ErrorResponse"
CreateUserResp:
properties:
status:
type: integer
description: Response status
response:
$ref: "#/definitions/MsgResponse"
MsgResponse:
required:
- resp_msg
properties:
resp_msg:
type: string
为了检查响应格式,我从 Swagger Editor 生成了 NodeJs 文件
examples['application/json'] = {
"response" : {
"resp_msg" : "aeiou"
},
"status" : 123
};
在控制器文件.js中:
function createNewUser(req,res){
....
var resp = new Object();
resp.resp_msg=data.email;
final_response.status = 200;
final_response.response = resp;
console.log("createNewUser::Query succeffully", JSON.stringify(final_response));
//{"status":200,"response":{"resp_msg":"test@gmail.com"}}
res.set('Content-Type', 'application/json');
res.json(final_response);
}
尝试使用 Postman 运行 API,错误发生在以下日志中:
Error: Response validation failed: failed schema validation
at throwErrorWithCode (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/lib/validators.js:121:13)
at Object.module.exports.validateAgainstSchema (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/lib/validators.js:176:7)
at /var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/middleware/swagger-validator.js:141:22
at /var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/node_modules/async/lib/async.js:356:13
at async.forEachOf.async.eachOf (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/node_modules/async/lib/async.js:233:13)
at _asyncMap (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/node_modules/async/lib/async.js:355:9)
at Object.map (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/node_modules/async/lib/async.js:337:20)
at validateValue (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/middleware/swagger-validator.js:134:11)
at ServerResponse.res.end (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/middleware/swagger-validator.js:252:9)
at ServerResponse.send (/var/app/current/node_modules/express/lib/response.js:205:10)
我无法弄清楚是什么导致了错误,我仔细检查了 JSON 响应的结构。
非常感谢任何建议。
我试图重现,但它给了我一些错误。但是,我尝试删除 MsgResponse
并将 CreateUserResp
定义为单个定义,并且有效:
CreateUserResp:
type: object
properties:
response:
type: object
properties:
resp_msg:
type: string
description: The response object
status:
type: number
description: The status code
您似乎没有将 response
定义为对象,而只是向其添加一些属性。
在尝试了一些实验之后,我成功了。我的解决方案只是将 yaml 文件中的响应代码“201”更改为“200”,并且有效。我不知道为什么我留下了响应代码“201”。无论如何,我对此还是陌生的,不知道这是否是最佳做法。我愿意接受任何更好的建议。
你输入了 required: true 这意味着你必须传递该参数,否则会出现 Response Validation Failed。
如果您未在 header 中指定请求中发送的数据类型 body
,则可能会出现此错误
Content-Type : application/json
我正在使用 Swagger 和 NodeJS 构建 API,到目前为止我遇到的烦人的问题是 Swagger 验证响应,它并不总是顺利。
我的情况:
在文件 .yaml 中:我用 Swagger Editor 检查了 yaml 语法 => 文件 Yaml 是正确的。
/user/createNew:
x-swagger-router-controller: xxxxxxx
post:
tags:
- User
summary: Create New User
# used as the method name of the controller
operationId: createNewUser
parameters:
- name: NewUserReq
in: body
required: true
description: Email register
schema:
$ref: "#/definitions/NewUserReq"
responses:
"201":
description: Successful
schema:
# a pointer to a definition
$ref: "#/definitions/CreateUserResp"
# responses may fall through to errors
default:
description: Error
schema:
$ref: "#/definitions/ErrorResponse"
CreateUserResp:
properties:
status:
type: integer
description: Response status
response:
$ref: "#/definitions/MsgResponse"
MsgResponse:
required:
- resp_msg
properties:
resp_msg:
type: string
为了检查响应格式,我从 Swagger Editor 生成了 NodeJs 文件
examples['application/json'] = {
"response" : {
"resp_msg" : "aeiou"
},
"status" : 123
};
在控制器文件.js中:
function createNewUser(req,res){
....
var resp = new Object();
resp.resp_msg=data.email;
final_response.status = 200;
final_response.response = resp;
console.log("createNewUser::Query succeffully", JSON.stringify(final_response));
//{"status":200,"response":{"resp_msg":"test@gmail.com"}}
res.set('Content-Type', 'application/json');
res.json(final_response);
}
尝试使用 Postman 运行 API,错误发生在以下日志中:
Error: Response validation failed: failed schema validation
at throwErrorWithCode (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/lib/validators.js:121:13)
at Object.module.exports.validateAgainstSchema (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/lib/validators.js:176:7)
at /var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/middleware/swagger-validator.js:141:22
at /var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/node_modules/async/lib/async.js:356:13
at async.forEachOf.async.eachOf (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/node_modules/async/lib/async.js:233:13)
at _asyncMap (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/node_modules/async/lib/async.js:355:9)
at Object.map (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/node_modules/async/lib/async.js:337:20)
at validateValue (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/middleware/swagger-validator.js:134:11)
at ServerResponse.res.end (/var/app/current/node_modules/swagger-express-mw/node_modules/swagger-node-runner/node_modules/swagger-tools/middleware/swagger-validator.js:252:9)
at ServerResponse.send (/var/app/current/node_modules/express/lib/response.js:205:10)
我无法弄清楚是什么导致了错误,我仔细检查了 JSON 响应的结构。
非常感谢任何建议。
我试图重现,但它给了我一些错误。但是,我尝试删除 MsgResponse
并将 CreateUserResp
定义为单个定义,并且有效:
CreateUserResp:
type: object
properties:
response:
type: object
properties:
resp_msg:
type: string
description: The response object
status:
type: number
description: The status code
您似乎没有将 response
定义为对象,而只是向其添加一些属性。
在尝试了一些实验之后,我成功了。我的解决方案只是将 yaml 文件中的响应代码“201”更改为“200”,并且有效。我不知道为什么我留下了响应代码“201”。无论如何,我对此还是陌生的,不知道这是否是最佳做法。我愿意接受任何更好的建议。
你输入了 required: true 这意味着你必须传递该参数,否则会出现 Response Validation Failed。
如果您未在 header 中指定请求中发送的数据类型 body
,则可能会出现此错误Content-Type : application/json