2014-09-20 7 views
8

Ich habe ein Formular mit drei Feldern, das aus einem Namensfeld, einem E-Mail-Feld und einem Textfeld besteht. Ich benutze Joi 4.7.0 Version zusammen mit hapijs. Ich benutze das Objekt unten, um die Eingabe zu validieren. Ich erhalte das Datenobjekt von einem Ajax-Aufruf. Wenn ich alle drei Felder mit falschen Informationen fülle, bekomme ich nur die Nachricht bezüglich des ersten falschen Feldes. Wie folgt aus:Joi-Validierung gibt nur eine Fehlermeldung zurück

"{"statusCode":400,"error":"Bad Request","message":"name is not allowed to be empty","validation": {"source":"payload","keys":["data.name"]}}" 

validate: { 
     payload: { 
     data: { 
      name: Joi.string().min(3).max(20).required(), 
      email: Joi.string().email().required(), 
      message: Joi.string().min(3).max(1000).required() 
     } 
     } 
} 

Zur Erklärung Lassen Sie nehmen nicht an das drei Feld zu füllen. Ich bekomme nur einen Nachrichtenfehler und nicht den Nachrichtenfehler der anderen Felder. Warum?

Antwort

17

Es passiert, weil Joi vorzeitig abbricht.

abortEarly - when true , stops validation on the first error, otherwise returns all the errors found. Defaults to true .

* EDIT: Konfiguration hat in hapi 8.0 geändert. Sie müssen abortEarly: false zum routes Config hinzuzufügen:

var server = new Hapi.Server(); 
server.connection({ 
    host: 'localhost', 
    port: 8000, 
    routes: { 
     validate: { 
      options: { 
       abortEarly: false 
      } 
     } 
    } 
}); 

* die Joi API documentation Details für mehr sehen.
* Siehe auch validation unter Hapi Route options.

So Joi stoppt die Validierung auf dem ersten Fehler:

var Hapi = require('hapi'); 
var Joi = require('joi'); 

var server = new Hapi.Server('localhost', 8000); 

server.route({ 
    method: 'GET', 
    path: '/{first}/{second}', 
    config: { 
     validate: { 
      params: { 
       first: Joi.string().max(5), 
       second: Joi.string().max(5) 
      } 
     } 
    }, 
    handler: function (request, reply) { 

     reply('example'); 
    } 
}); 

server.start(); 

server.inject('/invalid/invalid', function (res) { 

    console.log(res.result); 
}); 

Ausgänge:

{ statusCode: 400, 
    error: 'Bad Request', 
    message: 'first length must be less than or equal to 5 characters long', 
    validation: { source: 'params', keys: [ 'first' ] } } 

Sie können Hapi jedoch konfigurieren, dass alle Fehler zurück. Dazu müssen Sie abortEarly auf false setzen. Sie können dies in Server-Konfiguration tun:

var server = new Hapi.Server('localhost', 8000, { validation: { abortEarly: false } }); 

Wenn Sie das Skript jetzt ausführen, erhalten Sie:

{ statusCode: 400, 
    error: 'Bad Request', 
    message: 'first length must be less than or equal to 5 characters long. second length must be less than or equal to 5 characters long', 
    validation: { source: 'params', keys: [ 'first', 'second' ] } } 
4

Der validation Schlüssel funktioniert nicht mehr mit dem Hapi.Server Konstruktor in Hapi 8.0:

[1] validation is not allowed

Ich fand die Lösung in einem GitHub issue for hapi:

var Hapi = require('hapi'); 


var server = new Hapi.Server(); 

server.connection({ 
    host: HOST, 
    port: PORT, 
    routes: { 
    validate: { 
     options: { 
     abortEarly: false 
     } 
    } 
    } 
}); 

// Route using Joi goes here. 
server.route({}); 

server.start(function() { 
    console.log('Listening on %s', server.info.uri); 
}); 
3

Ich integriere nicht mit hapi.js, aber ich habe festgestellt, dass es ein ValidationOptions Objekt gibt, das weitergegeben werden kann. Innerhalb dieses Objekt ist die abortEarly Option, so sollte diese Arbeit:

Joi.validate(request, schema, {abortEarly: false}

Dies auch wie folgt konfiguriert werden kann:

Joi.object().options({ abortEarly: false }).keys({...}); 

Schauen Sie sich diese Typdefinitionen für mehr ValidationOptions: https://github.com/DefinitelyTyped/tsd/blob/master/typings/joi/joi.d.ts

Verwandte Themen