mdg:validation-error

v0.3.0Published 8 years ago

This package has not had recent updates. Please investigate it's current state before committing to using it in your project.

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:

  1. An argument isn't of the right type
  2. A number argument isn't in the right range
  3. 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 ./