最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解JavaScript如何安全的進行數(shù)據(jù)獲取

 更新時間:2023年03月19日 14:01:28   作者:zayyo  
這篇文章主要為大家介紹了JavaScript如何安全的進行數(shù)據(jù)獲取方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

獲取數(shù)據(jù)的方式

fetch可能是我們在 JavaScript 獲取數(shù)據(jù)最常見的方式。

但是,我們用fetch獲取數(shù)據(jù)的的代碼很有可能存在安全問題:

代碼示例:

const res = await fetch('/user')
const user = await res.json()

上面這段代碼雖然簡單好用,但存在許很多問題。

  • 問題一、缺少“錯誤處理”

當然你可能會說這個問題很好解決嘛,給她添加一個try/catch就好了,遇到錯誤就會拋出了嘛!

代碼示例:

try {
  const res = await fetch('/user')
  const user = await res.json()
} catch (err) {
  // 處理錯誤的代碼
}

當然,這樣可以確實可以對我們的錯誤進行處理了。遇到錯誤的時候也會拋出,但是就算這樣寫了還是存在很多的問題,對錯誤的覆蓋能力不全面。

  • 問題二:無法識別部分錯誤代碼

在這里,我們假設(shè)user實際上是一個用戶對象。我們假設(shè)我們得到了響應(yīng)200

但是fetch不會針對非 200 的狀態(tài)拋出錯誤,因此如果你收到了400(錯誤請求)、401(未授權(quán))、404(未找到)、500(內(nèi)部服務(wù)器錯誤)或各種其他問題都不會進行錯誤拋出。

那你可能有會說了那我們用個if進行判斷然后對不同的錯誤碼進行分類處理不就好了!

于是我們就有了下面的代碼

try {
  const res = await fetch('/user')
  if (!res.ok) {
    switch (res.status) {
      case 400: /* 錯誤處理 */ break
      case 401: /* 錯誤處理 */ break
      case 404: /* 錯誤處理 */ break
      case 500: /*錯誤處理 */ break
    }
  }
  // User 已經(jīng)是我們最新的數(shù)據(jù)了
  const user = await res.json()
} catch (err) {
  // 錯誤處理
}

現(xiàn)在,我們算是基本實現(xiàn)了fetch對數(shù)據(jù)的安全獲取了. 但是這樣寫是很臃腫且笨重的,因為每次都必須重寫寫一次錯誤的處理邏輯,而如果是團隊開發(fā)的話對每個成員的要求會更高,要求每個同事都要按照同樣的邏輯來處理請求。而且在可讀性方面,也是很差的,維護起來很麻煩。

那么我們可不可以換一種更優(yōu)雅的方式來處理我們的邏輯代碼呢?

更優(yōu)雅的方式

我們可以使用throw來處理我們的不同的錯誤響,而不是使用switch/case.

try {
  const res = await fetch('/user')
  if (!res.ok) {
    throw new Error('錯誤的響應(yīng)')
  }
  const user = await res.json()
} catch (err) {
  // 錯誤處理
}

但是我們還剩下最后一個問題——就是當我們需要處理錯誤時,我們丟失了很多有用的上下文。我們無法在 catch 塊中訪問,因此查看處理錯誤時我們上并不知道響應(yīng)的狀態(tài)代碼或錯誤的詳細信息。

這會讓我們debug變的很困難,很難去查錯。那我們要怎么才能拿到error的上下文呢?

最好的方法可能是創(chuàng)建我們自己的自定義錯誤類,并且在錯誤類中轉(zhuǎn)發(fā)響應(yīng)的詳細信息:

代碼:

class ResponseError extends Error {
  constructor(message, res) {
    super(message)
    this.response = res
  }
}
try {
  const res = await fetch('/user')
  if (!res.ok) {
    throw new ResponseError('錯誤的響應(yīng)信息(error的上下文信息)', res)
  }
  const user = await res.json()
} catch (err) {
  //我們可以拿到錯誤的詳細信息,也就是error的上下文
  switch (err.response.status) {
    case 400: /* 錯誤處理 */ break
    case 401: /* 錯誤處理 */ break
    case 404: /* 錯誤處理 */ break
    case 500: /* 錯誤處理 */ break
  }
}

現(xiàn)在我們保留狀態(tài)代碼等error信息,這樣可以讓我們的用戶了解錯誤的原因的也能讓我們更好的處理錯誤。

例如,我們可以提醒用戶500我們遇到了問題,并可以讓客戶聯(lián)系我們的進行解決。

或者如果狀態(tài)為401,則他們當前未授權(quán),可能需要重新登錄等。

封裝類

雖然上面的代碼可以解決我們的所有問題,但是它仍然存在一個不穩(wěn)定性,就是代碼的健壯性取決于開發(fā)人員的個人素質(zhì)和能力。我們的的請求安全并不能等到統(tǒng)一的保障。

我們可以對我們代碼進行封裝,然后使用時進行導出引用就行了

class ResponseError extends Error {
  constructor(message, res) {
    this.response = res
  }
}
export async function myFetch(...options) {
  const res = await fetch(...options)
  if (!res.ok) {
    throw new ResponseError('錯誤響應(yīng)的信息', res)
  }
  return res
}

然后我們可以按下面的方式去使用它:

try {
  const res = await myFetch('/user')
  const user = await res.json()
} catch (err) {
  // 錯誤的處理代碼
}

在我們的封裝代碼中,最好確保有一個統(tǒng)一的方式來處理錯誤。因為這里面包括給用戶的警報、日志記錄等。

開源的解決方案

當然如果我們的水平還沒有達到可以自己封裝一個完善的請求類時我們也可以去網(wǎng)上使用一些別封裝好的請求類,

axios

  • axios是一個非常流行的 JS 請求數(shù)據(jù)的庫,它已經(jīng)幫我們解決了上面我們探討的幾個問題。
try {
  const { data } = await axios.get('/user')
} catch (err) {
  // 錯誤處理代碼
}

我覺得 Axios 的唯一缺點是包太大,如果我們只是在一個項目獲取一個很簡單的數(shù)據(jù)時使用axios需要引入一個11kb的包,,反而會使我們的項目變的臃腫。

Redaxios

如果你覺得項目的大小對你更重要是你可以選擇Redaxios

  • Redaxios使用有 Axios 一樣的 API,但不到大小卻不到[1kb]
import axios from 'redaxios'
// use as you would normally

Wretch

還有一個不錯的選項是Wretch,它是 Fetch封裝成的一個非常小的包,和 Redaxios 一樣。Wretch 的特別之處在于它在很大程度上還原了原生的數(shù)據(jù)請求方法,但是它幫我們封裝了很多的錯誤處理代碼。

const user = await wretch("/user")
  .get()
  // Handle error cases in a more human-readable way
  .notFound(error => { /* ... */ })
  .unauthorized(error => { /* ... */ })
  .error(418, error => { /* ... */ })
  .res(response => /* ... */)
  .catch(error => { /* uncaught errors */ })

以上就是一文詳解在JavaScript中如何安全的進行數(shù)據(jù)獲取的詳細內(nèi)容,更多關(guān)于JavaScript數(shù)據(jù)安全獲取的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 微信小程序頁面滑動屏幕加載數(shù)據(jù)效果

    微信小程序頁面滑動屏幕加載數(shù)據(jù)效果

    這篇文章主要為大家詳細介紹了微信小程序頁面滑動屏幕加載數(shù)據(jù)效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Javascript實現(xiàn)簡單二級下拉菜單實例

    Javascript實現(xiàn)簡單二級下拉菜單實例

    這篇文章主要介紹Javascript實現(xiàn)二級下拉菜單的具體過程,需要的朋友可以參考下
    2014-06-06
  • Webpack的Loader和Plugin的區(qū)別

    Webpack的Loader和Plugin的區(qū)別

    這篇文章主要介紹了Webpack的Loader和Plugin的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • JavaScript隨機打亂數(shù)組順序之隨機洗牌算法

    JavaScript隨機打亂數(shù)組順序之隨機洗牌算法

    這篇文章主要介紹了JavaScript隨機打亂數(shù)組順序之隨機洗牌算法的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • electron 引入node服務(wù)的操作方法

    electron 引入node服務(wù)的操作方法

    這篇文章主要介紹了electron 引入node服務(wù)的操作方法,引入node服務(wù)很簡單,直接在electron的主體中引入就可以了,對electron 引入node服務(wù)感興趣的朋友一起看看吧
    2024-03-03
  • 詳解TypeScript中模塊化開發(fā)指南

    詳解TypeScript中模塊化開發(fā)指南

    在編程中,模塊是指將相關(guān)的代碼封裝在一起,形成一個獨立的單元,在這篇文章中,我們將深入探討在TypeScript中如何定義、導入和導出模塊,感興趣的可以了解一下
    2023-06-06
  • ES6 Promise.race的用法詳解

    ES6 Promise.race的用法詳解

    本文主要介紹了ES6 Promise.race的用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • 利用微信小程序制作屬于自己的Icon圖標

    利用微信小程序制作屬于自己的Icon圖標

    項目中常常需要使用到字體圖標,微信小程序中使用字體圖標與在平常的web前端中類似但是又有區(qū)別,下面這篇文章主要給大家介紹了關(guān)于利用微信小程序制作屬于自己的Icon圖標的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • JS類中定義原型方法的兩種實現(xiàn)的區(qū)別

    JS類中定義原型方法的兩種實現(xiàn)的區(qū)別

    JS類中定義原型方法的兩種實現(xiàn)的區(qū)別...
    2007-03-03
  • 在JavaScript中生成不可修改屬性對象的方法

    在JavaScript中生成不可修改屬性對象的方法

    這篇文章主要介紹了在 JavaScript 中生成不可修改屬性對象的方法,包括相關(guān)函數(shù)及原理,并列舉了在狀態(tài)管理、數(shù)據(jù)緩存、函數(shù)式編程等場景中的實際應(yīng)用,還通過代碼示例進行了詳細說明,需要的朋友可以參考下
    2024-12-12

最新評論

左权县| 封丘县| 龙海市| 古蔺县| 石首市| 铜梁县| 明溪县| 正安县| 象山县| 饶阳县| 栾城县| 崇仁县| 萨迦县| 山东| 鄄城县| 皮山县| 磐安县| 咸丰县| 汉中市| 法库县| 龙泉市| 东丰县| 金溪县| 莱西市| 沾化县| 永泰县| 沂南县| 阳谷县| 台安县| 治多县| 浪卡子县| 芮城县| 广河县| 本溪| 关岭| 马公市| 永登县| 鲁山县| 安达市| 兴隆县| 大荔县|