ValidationError
meteor add mdg:validation-error
Use a validation error to indicate that a method call has failed and the client can fix it by changing specific arguments. Examples:
- An argument isn't of the right type
- A number argument isn't in the right range
- A username wasn't found in the database
This kind of error is tied to a specific field so that you can display it next to an input in a form currently being filled by the user.
This error format is based on the error output of aldeed:simple-schema
.
API
new ValidationError(errors: Array, [message: String])
errors
must be a array with keys of the form:
1[ 2 { 3 // Name of the field this error is about 4 name: String, 5 6 // Type of error, can be mapped to a nice message 7 // on the client 8 type: String, 9 10 // Any kind of details, depends on the type of error. 11 // Should probably include a `value` field that 12 // contains the invalid value passed from the client. 13 details: Object 14 } 15 ... 16]
message
is an optional string to use for the error message so that the text printed at the top of the stack trace when the error is thrown is more useful. For example, if you pass in the error {name: 'name', type: 'required'}
, you may want to also pass in the message "Name is required".
Usage example
1// Inside a method definition 2saveProduct({ name, cost, category }) { 3 if (cost > 1000) { 4 throw new ValidationError([ 5 { 6 name: 'cost', 7 type: 'out-of-range', 8 details: { 9 value: cost, 10 min: 0, 11 max: 100 12 } 13 } 14 ]); 15 } 16 17 // ... the rest of the method 18}
You might catch the error returned by a method call and display it in the UI:
1Template.foo.events({ 2 'submit': (event, instance) => { 3 Meteor.call('method', (err) => { 4 if (err && err.error === ValidationError.ERROR_CODE) { 5 err.details.forEach((fieldError) => { 6 instance.state.set(`error-${fieldError.name}`: fieldError.type); 7 }); 8 } 9 }); 10 } 11});
Works out of the box with mdg:method
This type of error is automatically thrown for invalid arguments if you use the mdg:method
package, where you can specify a schema for the arguments of your method.
Running tests
meteor test-packages --driver-package practicalmeteor:mocha ./