简体   繁体   中英

Meteor js: get full validation message with validatedmethod simpleschema

I am new to Meteor js and I am trying to create a form following the official guide http://guide.meteor.com/methods.html#method-form . It suggests to use mdg:validated-method package and aldeed:simple-schema for validation which are based on mdg:validation-error to return validation error messages to the client. The guide suggests this code then to handle validation

Invoices.methods.insert.call(data, (err, res) => {
    if (err) {
        if (err.error === 'validation-error') {
            // Initialize error object
            const errors = {
                email: [],
                description: [],
                amount: []
            };

            // Go through validation errors returned from Method
            err.details.forEach((fieldError) => {
                // XXX i18n
                errors[fieldError.name].push(fieldError.type);
            });

            // Update ReactiveDict, errors will show up in the UI
            instance.errors.set(errors);
        }
    }
});

but the problem is that only fieldError.type, fieldError.name and first human readable message from simple-schema are available in err.error. I use translated messages and field labels in simple-schema to get nice understandable validation error messages. So getting just object property name with "required" is unacceptable, especially in the case when message includes min/max constraints for example. I could not find any way to get simple-schema's validation context to retrieve the full list of human readable errors.

So my question is can I get full error messages on the client and how? Or maybe there are better ways to achieve what I am trying to do?

Thanks in advance

Hi! Recently I have encountered with the same problem. So I just create pull request with some code enhancement to solve this issue. Now when you submit form and call validated-method from client side like following:

yourMethodName.call(data, (err) => {
 if (err.error === 'validation-error') {
   console.dir(err, 'error ')
  }
});

You will see error object in the console :

{
  "errorType": "ClientError",
  "name": "ClientError",
  "details": [
    {
      "name": "firstName",
      "type": "required",
      "message": "First name is required"
    },
    {
      "name": "lastName",
      "type": "required",
      "message": "Last name is required"
    },
    {
      "name": "phone",
      "type": "required",
      "message": "Phone is required"
    },
    {
      "name": "email",
      "type": "required",
      "message": "Email is required"
    }
  ],
  "error": "validation-error"
}

So I just copy that from my console output. In my case, the method is as follows:

export const yourMethodName = new ValidatedMethod({
  name: 'my.awesome.method',
  validate: new SimpleSchema({
    firstName: { type: String },
    lastName: { type: String },
    phone: { type: Number },
    email: { type: String, regEx: SimpleSchema.RegEx.Email }
  }).validator({ clean: true }),
  run(doc) {
    YourCollection.insert(doc);
  }
});

If my pull request will be accepted, you can easy use node-simple-schema (it is the next version of meteor-simple-schema ). If it won't you can use my fork .

Hope this helps!

EDIT: Now this feature available in official node-simple-schema package .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM