【问题标题】:Meteor js: get full validation message with validatedmethod simpleschemaMeteor js:使用验证方法 simpleschema 获取完整验证消息
【发布时间】:2017-05-05 16:34:53
【问题描述】:

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

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

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

提前致谢

【问题讨论】:

  • 我还在 aldeed:simple-schema github 项目中添加了一个issue

标签: javascript validation meteor simple-schema


【解决方案1】:

你好!最近我遇到了同样的问题。 所以我只是创建了pull request 并通过一些代码增强来解决这个问题。现在,当您提交表单并从客户端调用validated-method 时,如下所示:

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

您将在console 中看到error object

{
  "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

希望这会有所帮助!

编辑:现在这个功能在官方 node-simple-schema package 中可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-30
    • 2019-07-17
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多