You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Sails模型添加自定义验证函数后程序无报错终止?

解决Sails模型自定义验证导致程序终止的问题

嘿,我之前也踩过这个坑!你的问题出在Sails自定义验证函数的写法不符合规范——虽然你返回了true,但Sails的验证系统并不会把这个布尔值当成“验证通过”的信号,反而会因为预期之外的返回值导致整个流程中断,既不写入数据库也不触发回调。

为什么会这样?

在Sails(尤其是v1.x及以后版本)中,同步的custom验证函数遵循的是“无错即通过”的逻辑:

  • 如果验证通过,函数不需要返回任何值,直接正常结束即可;
  • 如果验证失败,需要抛出一个错误对象来告知验证系统。

直接返回布尔值(哪怕是true)会打乱Sails内部的验证流程,导致程序异常终止。

修正后的代码示例

你可以把代码改成这样,验证通过时不返回任何值,失败时抛出错误:

module.exports = {
  attributes: {
    somefield: {
      type: 'string',
      required: true,
      custom: function(value) {
        // 这里写你的实际验证逻辑,比如示例中的简单判断
        // 验证通过的话,什么都不做,直接结束函数
        // 如果验证失败,抛出错误
        // if (value.length < 5) {
        //   throw new Error('somefield长度不能小于5');
        // }
      }
    },
  }
}

异步验证的写法(如果需要)

如果你的验证逻辑是异步的(比如需要查询数据库做唯一性校验),可以用async/await返回Promise,或者使用回调:

// 异步写法(推荐)
custom: async function(value) {
  const duplicate = await User.findOne({ somefield: value });
  if (duplicate) {
    throw new Error('该字段的值已经存在');
  }
}

// 旧版回调写法
custom: function(value, cb) {
  User.findOne({ somefield: value }, (err, duplicate) => {
    if (err) return cb(err);
    if (duplicate) return cb(new Error('该字段的值已经存在'));
    cb(); // 验证通过时调用空回调
  });
}

按照这个规范修改后,你的自定义验证就能正常工作,程序也不会再莫名终止了。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:43:45