thinkjs / thinkjs

Use full ES2015+ features to develop Node.js applications, Support TypeScript.
https://thinkjs.org/
MIT License
5.31k stars 616 forks source link

logic 里面如何验证需要查询数据库的字段? #752

Closed junmaqiang closed 7 years ago

junmaqiang commented 7 years ago

DESC

我看官方文档里面有我标题所需的配置, https://thinkjs.org/zh-cn/doc/3.0/logic.html#field

但是就没明白例子如何写? 无从下手, 求大拿给一个例子做参考! 非常感谢!

junmaqiang commented 7 years ago

以下是我升级3.0之前的写法

if (think.isEmpty(data.mobile)) {
  return this.fail("手机号码不能为空!")
} else {
  res = await this.model("member").where({ mobile: data.mobile }).find();
  if (!think.isEmpty(res)) {
    return this.fail("手机号码已存在,请重新填写!")
  }
}

我想把验证移动到logic里面, 但对于需要读取数据库信息的字段验证,没有参考!

welefen commented 7 years ago

查询数据库属于异步操作,现在不支持异步校验的情况,这种情况下可以手工在 Logic 里校验。

junmaqiang commented 7 years ago

求例子, @welefen 银哥

welefen commented 7 years ago

@junmaqiang 哈哈,找到一种可以直接校验的方式了。 @lushijie 说明下

lushijie commented 7 years ago

方法1:

module.exports = class extends think.Logic {
  async validAction() {
    let rules = {
      mobile: {
        required: true,
        aliasName: '手机号'
        // 其他校验规则请查看文档
      }
    }

    if(!this.validate(rules)) {
      return this.fail(this.validateErrors); // 当然可以自己返回特定错误信息
    }

    // 数据库字段验证
    let res = await this.model('member').where({ mobile: this.ctx.post().mobile }).find();
    if (!think.isEmpty(res)) {
      return this.fail('手机号码已经存在,请重新填写');
    }
  }
}

方法2:


  async valid2Action() {
     this.rules = {
      mobile: {
        required: true,
        aliasName: '手机号'
        // 其他校验规则请查看文档
      },
      DBPhone: {
        // 这里需要自定义一个valid方法,用来验证数据库中这个字段不存在,自定义方法查看文档
        value: await this.model('member').where({ mobile: this.ctx.post().mobile }).find()
      }
    }
  }

Best wishes!

welefen commented 7 years ago

直接用方法 2 吧,并且 @lushijie 看下能不能加个默认规则名用来检测这种情况的。

lushijie commented 7 years ago

方法3:

  async indexAction() {
    let rules = {
      phone: {
        required: true,
        value: !(await this.model('member').where({ mobile: this.ctx.post().mobile }).find()).length || ''
      }
    }
    let msgs = {
      phone: '数据库中已经存在'
    }
    if(this.validate(rules, msgs)) {
      return this.fail(this.validateErrors);
    }
  }

利用已有的required校验方法,自己构造了value(required 采用了 isTrueEmpty 校验,所以这里要有个 '' 的转换,https://github.com/thinkjs/think-helper/blob/master/index.js#L172)