link98
link98
  • 发布:2025-12-14 18:35
  • 更新:2025-12-14 18:36
  • 阅读:16

请问为什么表单字段校验不通过还是会继续执行提交表单,用schema2code生成的代码

分类:uniCloud

请问为什么表单字段数据库校验不通过虽然会弹出数据库校验失败,但还是会继续执行提交表单,用schema2code生成的代码
/**

  • 验证表单并提交
    */
    submit() {
    uni.showLoading({
    mask: true
    })
    this.$refs.form.validate().then((res) => {
    return this.submitForm(res)
    }).catch(() => {
    }).finally(() => {
    uni.hideLoading()
    })
    },

    /**

  • 提交表单
    */
    submitForm(value) {
    // 使用 clientDB 提交数据
    return db.collection(dbCollectionName).doc(this.formDataId).update(value).then((res) => {
    uni.showToast({
    icon: 'none',
    title: '修改成功'
    })
    this.getOpenerEventChannel().emit('refreshData')
    setTimeout(() => uni.navigateBack(), 500)
    }).catch((err) => {
    uni.showModal({
    content: err.message || '请求服务失败',
    showCancel: false
    })
    })
    },
2025-12-14 18:35 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

您的问题涉及表单验证流程的理解。在 uniCloud 中,前端表单验证数据库 schema 校验是两个独立环节:

  1. this.$refs.form.validate() 仅执行前端校验(基于 uni-app 表单组件的规则),通过后才触发 submitForm
  2. 数据库校验(如字段类型、必填、范围等)发生在 db.update() 的服务端执行阶段,属于后端校验

您观察到的现象是正常流程:

  • 前端校验通过 → 提交请求到云数据库
  • 云数据库执行 schema 校验 → 若失败则返回错误(被 submitForm.catch 捕获)
  • 前端无法预知服务端校验结果,因此必须先提交再处理错误

根本原因:
schema2code 生成的前端代码仅同步前端校验规则,无法提前模拟服务端数据库校验(因校验逻辑在云端)。这是设计使然,符合前后端分离原则。

解决方案:

  1. 确保前端表单规则与数据库 schema 完全一致(参考 DB Schema 文档
  2. 如需更复杂的校验逻辑,使用 schema.ext.js 扩展实现服务端前置校验(文档说明

注意:数据库校验失败属于业务异常,需在 .catch 中友好提示(如您代码中的 uni.showModal),而非阻止提交动作——因为提交是校验的前提条件。

内容为 AI 生成,仅供参考
AI问答小助手

AI问答小助手 - AI智答引擎,优解尽在掌握!

从代码来看,表单校验通过后仍会提交的原因是 validate().catch() 中没有阻止后续操作。当校验失败时,.catch() 里是空的,没有返回 Promise.reject() 或抛出错误,导致 finally 仍会执行,且不会阻止后续的 submitForm 调用。

建议修改 submit 方法,在校验失败时明确阻止提交:

submit() {  
  uni.showLoading({mask: true})  
  this.$refs.form.validate().then((res) => {  
    return this.submitForm(res)  
  }).catch((err) => {  
    return Promise.reject(err) // 明确拒绝  
  }).finally(() => {  
    uni.hideLoading()  
  })  
}

这样校验失败时会中断流程,不会执行 submitForm

来源

内容为 AI 生成,仅供参考

要回复问题请先登录注册