Meteor js:使用validatedmethod simpleschema获取完整的验证消息

时间:2016-03-11 23:30:27

标签: javascript validation meteor simple-schema

我是Meteor js的新手,我正在尝试按照官方指南http://guide.meteor.com/methods.html#method-form创建一个表单。它建议使用mdg:validated-method包和aldeed:simple-schema进行验证,它基于mdg:validation-error将验证错误消息返回给客户端。该指南建议此代码处理验证

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

但问题是err.error中只提供了来自simple-schema的fieldError.type,fieldError.name和 first 人类可读消息。我在简单模式中使用已翻译的消息和字段标签来获得可理解的验证错误消息。因此,仅使用“required”获取对象属性名称是不可接受的,尤其是在消息包含最小/最大约束的情况下。我找不到任何方法来获取简单模式的验证上下文来检索人类可读错误的完整列表。

所以我的问题是我可以在客户端上获得完整的错误消息吗? 或者也许有更好的方法来实现我想要做的事情?

提前致谢

1 个答案:

答案 0 :(得分:0)

嗨!最近我遇到了同样的问题。 因此,我只需使用一些代码增强功能创建pull request即可解决此问题。现在,当您提交表单并从客户端调用validated-method时,如下所示:

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

您会在error object中看到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"
}

所以我只是从我的控制台输出中copy that。 就我而言,方法如下:

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

如果我的拉取请求被接受,您可以轻松使用node-simple-schema(这是meteor-simple-schema的下一个版本)。 如果不能,您可以使用我的fork

希望这有帮助!

编辑:现在官方节点简单架构package中提供此功能。