2017-02-11 5 views
0

Ich baue die API mit Swagger und NodeJS, das lästige Problem, dem ich bisher begegnet bin, ist Swagger validiert die Antwort, und es ist nicht immer glatt.Swagger Nodejs - Response Validation fehlgeschlagen

Mein Fall:

In Datei .yaml: Ich habe die yaml Syntax mit Swagger Editor geprüft => Datei Yaml korrekt ist.

/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 

das Antwortformat zu überprüfen, ich erzeugten NodeJS von Swagger Editor-Datei

examples['application/json'] = { 
    "response" : { 
     "resp_msg" : "aeiou" 
    }, 
    "status" : 123 
}; 

In Controller Datei 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":"[email protected]"}} 

res.set('Content-Type', 'application/json'); 
res.json(final_response); 
} 

Versuchen zu laufen API mit Postman, der Fehler passiert mit dem Protokoll unten:

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) 

Ich kann nicht herausfinden, was den Fehler verursacht hat, ich habe die Struktur der JSON-Antwort überprüft.

Sehr zu schätzen für jeden Vorschlag.

Antwort

0

Nachdem ich einige Experimente versucht habe, habe ich es geschafft. Meine Lösung ändert einfach Antwortcode "201" zu "200" in Yaml-Datei, und es hat funktioniert. Ich weiß nicht, warum ich den Antwortcode "201" gelassen habe. Jedenfalls bin ich damit noch neu und weiß nicht, ob es eine Best Practice ist oder nicht. Ich bin offen für einen besseren Vorschlag.

+0

Vielen Dank, das hat es für mich behoben! – AliF50

0

Ich habe versucht, zu reproduzieren, aber es gibt mir einige Fehler. Allerdings habe ich versuchte MsgResponse entfernen und CreateUserResp als eine einzige Definition definieren, und es funktionierte:

CreateUserResp: 
    type: object 
    properties: 
    response: 
     type: object 
     properties: 
     resp_msg: 
      type: string 
      description: The response object 
    status: 
     type: number 
     description: The status code 

Es scheint, als ob du nicht response als ein Objekt definiert, und das Hinzufügen von nur einige Eigenschaften zu.

+0

Danke Luis für Ihre schnelle Antwort. Leider habe ich immer noch den Fehler mit deiner Antwort bekommen. –

+0

Konnten Sie das beheben? –

+0

ja, bitte beziehen Sie sich auf meinen Kommentar –

Verwandte Themen