我正在用Swagger和NodeJS构建API,到目前为止我遇到的恼人的问题是Swagger验证了响应,而且并不总是很顺利。
我的案子:
在文件.yaml中:我使用Swagger检查了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生成了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响应的结构。
非常感谢你的任何建议。
发布于 2017-02-13 20:15:00
在尝试了一些实验之后,我成功了。我的解决方案仅仅是将yaml文件中的响应代码"201“更改为"200”,它起了作用。我不知道为什么我留下了响应代码"201“。不管怎么说,我还是新来的,我不知道这是否是一个最佳实践。我愿意接受任何更好的建议。
发布于 2018-12-10 14:55:08
您已经将设置为required: true,这意味着您必须通过该参数,否则将出现响应验证失败的。
发布于 2017-02-11 17:56:32
我试着复制,但它给了我一些错误。但是,我尝试删除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定义为一个对象,而只是向其添加一些属性。
https://stackoverflow.com/questions/42177537
复制相似问题