2014-09-20 16 views
8

Ho una forma a tre campi composta da un campo nome, un campo e-mail e un'area testo. Sto usando la versione di Joi 4.7.0 insieme a hapijs. Io uso l'oggetto sottostante convalidare l'input. Ricevo l'oggetto dati da una chiamata Ajax. Quando riempio tutti e tre i campi con informazioni errate, ottengo solo il messaggio relativo al primo campo errato. Come quella:Convalida Joi restituisce solo un messaggio di errore

"{"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() 
     } 
     } 
} 

Per una spiegazione lasciare supporre di non riempire il campo a tre. Ricevo solo un messaggio di errore e non l'errore di messaggio degli altri campi. Perché?

risposta

17

Succede perché Joi annulla in anticipo di default.

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

* EDIT: configurazione è cambiato in Hapi 8.0. È necessario aggiungere abortEarly: false al routes config:

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

* Vedere la Joi API documentation per maggiori dettagli.
* Inoltre, vedere validation in Hapi Route options.

Così Joi ferma la convalida al primo errore:

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); 
}); 

Uscite:

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

È possibile tuttavia configurare Hapi di restituire tutti gli errori. Per questo, è necessario impostare abortEarly su false. È possibile farlo in configurazione server:

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

Se si esegue lo script ora, si ottiene:

{ 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

La chiave validation non funziona più con il costruttore Hapi.Server in Hapi 8.0:

[1] validation is not allowed

ho trovato la soluzione in un 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

Non sto integrando con hapi.js, ma ho notato che esiste un oggetto ValidationOptions che può essere passato. All'interno di quella oggetto è l'opzione abortEarly, quindi questo dovrebbe funzionare:

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

questo può anche essere configurato come segue:

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

Partenza queste definizioni di tipo per più ValidationOptions: https://github.com/DefinitelyTyped/tsd/blob/master/typings/joi/joi.d.ts

Problemi correlati