【问题标题】:Can I define a custom validation with options for Loopback?我可以使用 Loopback 选项定义自定义验证吗?
【发布时间】:2015-12-14 09:46:39
【问题描述】:

是否有规定的方法可以在环回中创建自定义验证器?例如,假设我想创建类似的东西:

Validatable.validatesRange('aProperty', {min: 0, max: 1000})

请注意,我知道:

Validatable.validates(propertyName, validFn, options)

我对 validates() 的问题是 validFn 无法访问这些选项。所以,我不得不硬编码这个逻辑;并为需要这种类型验证的每个属性创建一个自定义方法。这是不可取的。

同样,我熟悉:

Model.observes('before save', hookFn)

不幸的是,我什至无法声明 hookFn() 的选项。我没有这个特定的需求(至少现在还没有)。这只是我探索的一种途径,作为解决我的问题的可能替代方案。

感谢任何建议。提前致谢!

【问题讨论】:

  • 我在这里无法提供任何帮助,只能同意这非常令人沮丧!

标签: loopbackjs strongloop


【解决方案1】:

https://docs.strongloop.com/display/public/LB/Validating+model+data 提到了如何完成此操作

您也可以使用自定义验证调用 validate() 或 validateAsync() 功能。

这会将您带到此页面https://apidocs.strongloop.com/loopback-datasource-juggler/#validatable-validate

这提供了一个例子。

我自己试了一下……

  Question.validate('points', customValidator, {message: 'Negative Points'});
  function customValidator(err) {
    if (this.points <0) err();
  }

而且由于该函数名并没有真正在其他任何地方使用,而且(在这种情况下)该函数很短,我还使用匿名函数进行了尝试:

Question.validate('points', 
        function (err) { if (this.points <0) err(); }, 
        {message: 'Question has a negative value'})

当点数小于零时,它会抛出如下所示的验证错误。

{
  "error": {
    "name": "ValidationError",
    "status": 422,
    "message": "The `Question` instance is not valid. Details: `points` Negative Points (value: -100).",
    "statusCode": 422,
    "details": {
      "context": "Question",
      "codes": {
        "points": [
          "custom"
        ]
      },
      "messages": {
        "points": [
          "Negative Points"
        ]
      }

【讨论】:

  • 感谢您的回答。我已经标记了它,因为这是我不得不使用的方法。但你似乎错过了我原来问题的重点。这种方法的问题在于它迫使您将逻辑硬编码到验证器中,从而消除了它的可重用性。如果在下一个应用程序或表单上的其他地方你的最小值是 5 怎么办?你需要另一个功能。我只是一个梦想家/最纯粹的人。但是请注意如何将选项对象传递给 validate()?理想情况下,我可以访问函数中的那个对象。这将解决我的问题!
【解决方案2】:

您正在寻找的是validatesLengthOf()。例如:

Validatable.validatesLengthOf('aProperty', {min: 0, max: 1000});

这里是文档链接: All the methods of Validatable classModel-wise validation.

【讨论】:

  • 感谢您的回复。不幸的是,这不是我需要的。一方面,我使用了 ValidatesRange() 的示例——它旨在验证值的最小和最大范围,而不是有效长度的范围。但是,请注意,我也不是在寻找特定的验证!我想要的是一种能够定义我自己的验证的方法——比如 ValidatesRange()。我发现执行此操作的记录方法都已瘫痪(据我所知)。请看我的原帖。
  • 你考虑过在你的模型上使用prototype吗?
  • 并非如此。这是我想做的一个例子。该功能正在验证某物的长度。如果我想验证值的范围(比如可以在 1 到 100 之间的 int)怎么办?但这也只是代表性的。关键是, validatesLengthOf() 显然可以访问选项对象。我想编写一个 Validatable 函数来做同样的事情(即可以访问选项对象)。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 2023-03-30
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2022-11-02
相关资源
最近更新 更多