5

假设我Invoice在 SailsJS 中有一个模型。它有 2 个日期属性:issuedAtdueAt. 如何创建自定义验证规则来检查到期日期是否等于或大于发布日期?

我尝试创建自定义规则,但似乎我无法访问规则内的其他属性。

module.exports = {

  schema: true,

  types: {
    duedate: function(dueAt) {
      return dueAt >= this.issuedAt // Doesn't work, "this" refers to the function, not the model instance
    }
  },

  attributes: {

    issuedAt: {
      type: 'date'
    },

    dueAt: {
      type: 'date',
      duedate: true
    }

  }

};
4

2 回答 2

3

我希望您现在找到了解决方案,但是对于那些对处理此问题的好方法感兴趣的人,我将解释我的解决方法。

不幸的是,正如您所说,您无法在属性海关验证功能中访问其他记录属性。

@Paweł Wszoła 为您提供正确的方向,这是适用于 Sails@1.0.2 的完整解决方案:

// Get buildUsageError to construct waterline usage error
const buildUsageError = require('waterline/lib/waterline/utils/query/private/build-usage-error');

module.exports = {

  schema: true,

  attributes: {

    issuedAt: {
      type: 'ref',
      columnType: 'timestamp'
    },

    dueAt: {
      type: 'ref',
      columnType: 'timestamp'
    }

  },

  beforeCreate: (record, next) => {
    // This function is called before record creation so if callback method "next" is called with an attribute the creation will be canceled and the error will be returned 
    if(record.dueAt >= record.issuedAt){
      return next(buildUsageError('E_INVALID_NEW_RECORD', 'issuedAt date must be equal or greater than dueAt date', 'invoice'))
    }
    next();
  }

};
于 2019-02-14T15:49:16.773 回答
2

模型中的 beforeCreate 方法作为第一个参数取值。我在这里看到的这种验证的最佳位置。

beforeCreate: (values, next){
  if (values.dueAt >= values.issuedAt) {
      return next({error: ['...']})
  }
  next()
}

于 2013-11-27T11:01:08.433 回答