使用awaitTo之后无论登录成功或失败都执行了成功的逻辑

前言:利用awaitTo优化了await只能接收成功的结果之后,却发现无论成功还是失败都进行了登录成功的跳转!!!找了半天却发现少了它??

一、登录代码

handleLogin() {
      this.$refs.loginForm.validate(async(valid) => {
        if (valid) { //校验表单数据成功
          this.loading = true
          const [err, res] = await loginAPI(this.loginForm)
          console.log(err)// 错误对象
          console.log(res)// 成功对象
          if (!err) { //登录成功
            this.$router.push(this.$router.currentRoute.query.redirect || '/')
          } else { // 登录失败
            console.log('错啦错啦')
          }
        } else {  //校验表单数据失败
          console.log('error submit!!')
          return false
        }
      })
    }

遇到的错误

当运行发现登录失败也进行的路由页面跳转?就说明完了,代码写错了!接着打印一下就看看变量 err res 中拿到的数据是什么?

账号密码都对 说明应该登录成功 ,此时 err null  res是成功时后台返回的数据 ,控制台打印结果与我想的一样没有错,那就看看登录失败的情况

账号密码错误 说明应该登录成功 ,按着猜想应该是 err 错误对象 res undefined ,但是,制台打印结果却是:err null  res undefined ,很不对劲!!

为了便于找错,加一个提示信息,改进一下代码

二、改进登录逻辑代码

代码展示

handleLogin() {
      this.$refs.loginForm.validate(async(valid) => {
        if (valid) { //校验表单数据成功
          this.loading = true
          const [err, res] = await loginAPI(this.loginForm)
          console.log(err)// 错误对象
          console.log(res)// 成功对象
          if (!err) { //登录成功
            this.$message({
              message: res.message,
              type: 'success'
            })
            this.$router.push(this.$router.currentRoute.query.redirect || '/')
          } else { // 登录失败
            console.log('错啦错啦')
          }
        } else {  //校验表单数据失败
          console.log('error submit!!')
          return false
        }
      })
    }

错误表述:

账号密码都对,登录成功, 登录按钮加载状态关闭,进入首页,运行完美

账号密码不对 :登录应该失败,登录按钮加载状态关闭,给用户提示用户名或者密码不对.实际效果:登录按钮加载状态未关闭,打开控制台发现报错

报错展示

报错分析:

 index.vue 的168行报错::null 读message, 说明res是空,但是res是成功才会返回的结果,这里登录失败res 是空 ,是正确的,所以实际问题是,为什么登录失败却进入了成功的代码???因为有if判断,正常情况下不应该执行到168代码,应该直接进入else控制台打印 "错啦错啦" ,接下来就分析err.

同时应注意:如果代码执行报错,会导致后面的代码不再执行,所以登录按钮的loading状态还未来得及设置为false,所以登录按钮一直处于加载中也是这个错误造成的.

改错过程

打开network,看看后台给的响应数据是什么?

 结果发现这里并不是 null啊,经过抓耳挠腮的找错终于意识到,在代码的响应拦截器中,我曾对后台返回的数据进行过处理,所以去看响应拦截器

 因为后台无论成功失败还是失败给我的状态码都是200.所以拦截器不会进入到err 中,都是在response中,分析response 发现登录失败的else中return 的reject方法没写参数,那可不就是null了吗!

赶紧给个参数试试:

 运行:世界终于平静了........

猜你喜欢

转载自blog.csdn.net/weixin_45371730/article/details/122135744