Closed junmaqiang closed 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里面, 但对于需要读取数据库信息的字段验证,没有参考!
查询数据库属于异步操作,现在不支持异步校验的情况,这种情况下可以手工在 Logic 里校验。
求例子, @welefen 银哥
@junmaqiang 哈哈,找到一种可以直接校验的方式了。 @lushijie 说明下
方法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!
直接用方法 2 吧,并且 @lushijie 看下能不能加个默认规则名用来检测这种情况的。
方法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)
DESC
我看官方文档里面有我标题所需的配置, https://thinkjs.org/zh-cn/doc/3.0/logic.html#field
但是就没明白例子如何写? 无从下手, 求大拿给一个例子做参考! 非常感谢!