Vue3前后端交互错误处理一致性

在Web开发中,前后端的交互中错误处理是不可避免的,比如:前端提交数据,后端需要校验,对于不符合要求的数据需要在前端进行提示。通常的做法是在后端返回固定格式的JSON数据来处理,但由于返回的JSON格式在业务、团队等方面很难维护其规范性,所以借助错误处理的方式,在数据请求中统一封装,这样有助于程序员将精力集中到业务处理中。

1.环境

开发环境
前端Vue3
后端Python
FastAPI

2.后端处理规范

  • 后端在数据处理中,对数据库的操作均需要捕获异常

  • 对于捕获的异常可以通过错误处理给前端返回

  • 返回错误的方法如下

首先,定义一个 JSONResponse ,为什么使用 JSONResponse,而不是 HTTPException 呢?因为我们在代码中对数据库的操作需要捕获异常,所以在try块中如果使用 HTTPException 会被代码本身捕获,而不会输出到前端

然后,在出现错误的情况下,返回给前端即可。如:

from fastapi.responses import JSONResponse
......
json_response = JSONResponse(status_code=401, content={'detail': '鉴权失败'})
......
return json_response

也可以是:

return JSONResponse(
                status_code=404,
                content='机构名称未找到!'
            )

对于content参数,既可以是字典数据,也可以是字符串。

3.前端处理规范

前端处理中,直接在封装好的请求方法中统一处理,代码如下:

import axios from 'axios'
import swal from 'sweetalert'
import {loading, loaded} from './loading'
​
const config = {
  baseURL: '',
  timeout: 60000,
  headers: {
    'Content-Type': 'application/json'
  },
  responseType: 'json'
}
​
const postRequest = (url, data) => {
  let _id = loading()
  // eslint-disable-next-line
  const promise = new Promise((resolve, reject) => {
    config.headers['Authorization'] =
        localStorage.getItem('token_type') + ' ' + localStorage.getItem('access_token')
​
    axios.post(
      url, data, config
    ).then((response) => {
      loaded(_id)
      resolve(response)
    }).catch((error) => {
      loaded(_id)
      console.log(error)
      // 对error中的数据进行处理
      let status = error.response.status
      let txt = errorToString(error)
      // 弹出错误信息
      if (status === 401) {
        swal({
          title: status.toString(),
          text: txt,
          icon: 'error',
          button: "确定",
        }).then((value) => {
          console.log(value)
          // 路由跳转
        })
      } else {
        swal(status.toString(), txt, 'error')
      }
      // reject(error)
    })
  })
​
  return promise
}
​
function errorToString (error) {
  let text = ''
  if (error.response.data) {
    if (error.response.data instanceof Object)
      text = JSON.stringify(error.response.data)
    else
      text = error.response.data
  }
  return text
}

此处,针对返回的错误,对其数据进行处理,如果返回的是一个JSON格式的数据,则将其转换为字符串,否则直接显示。

对于401错误,在显示完错误信息后,进行路由跳转,一般的操作是直接跳转到登录页面。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐