2

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

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

提前致谢

4

1 回答 1

0

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

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

您将error objectconsole

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

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

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中可用。

于 2017-04-24T20:46:29.110 回答