我可以使用Loopback选项定义自定义验证吗?

时间:2015-09-17 13:38:30

标签: loopbackjs strongloop

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

  def set_location
    ip = request.ip
    @user_location = Geocoder.search(ip)
  end

请注意我知道:

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

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

同样,我熟悉:

Validatable.validates(propertyName, validFn, options)

不幸的是,我认为甚至无法为hookFn()声明选项。我没有这个特定的需求(至少,还没有)。这只是我探索的一种途径,可以解决我的问题。

任何建议表示赞赏。提前谢谢!

2 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:0)

您要找的是validatesLengthOf()。例如:

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

以下是文档链接: All the methods of Validatable classModel-wise validation