這簡化了資料獲取,但是如果您有大量都需要身份驗證的 API 怎麼辦? 為每個呼叫添加標頭很快就會變得乏味。

輸入攔截器。

為了添加全域攔截器,我們將圍繞 $fetch 建立一個自訂的可組合包裝器。當您的 API 呼叫始終需要授權標頭時,這尤其有價值。

作為基礎,讓我們使用我之前關於 Nuxt 3 中的身份驗證的部落格文章中的相同項目。

讓我們先在可組合資料夾 composables/useAuthFetch.ts 下建立一個新的可組合項目

import type { UseFetchOptions } from \\'nuxt/app\\';const useAuthFetch = (url: string | (() => string), options: UseFetchOptions = {}) => {  const customFetch = $fetch.create({    baseURL: \\'https://dummyjson.com\\',    onRequest({ options }) {      const token = useCookie(\\'token\\');      if (token?.value) {        console.log(\\'[fetch request] Authorization header created\\');        options.headers = options.headers || {};        options.headers.Authorization = `Bearer ${token.value}`;      }    },    onResponse({ response }) {      console.info(\\'onResponse \\', {        endpoint: response.url,        status: response?.status,      });    },    onResponseError({ response }) {      const statusMessage = response?.status === 401 ? \\'Unauthorized\\' : \\'Response failed\\';      console.error(\\'onResponseError \\', {        endpoint: response.url,        status: response?.status,        statusMessage,      });      throw showError({        statusCode: response?.status,        statusMessage,        fatal: true,      });    },  });  return useFetch(url, {    ...options,    $fetch: customFetch,  });};export default useAuthFetch;

解釋:

您可以在此處找到有關攔截器的更多資訊

現在,每當您需要從經過驗證的 API 取得資料時,只需使用 useAuthFetch 而不是 useFetch,授權將無縫處理。

\\\"Custom

當您檢查網路呼叫時,您可以看到 baseUrl 是正確的並且存在 Authorization 標頭

記錄

在我的攔截器中,我添加了一些日誌,如果您的應用程式中有像 Sentry 這樣的工具,這些日誌會很有用。

如何將Sentry加入Nuxt:https://www.lichter.io/articles/nuxt3-sentry-recipe/

在 onRequest 攔截器中,您可以為哨兵添加麵包屑

import * as Sentry from \\'@sentry/vue\\';Sentry.addBreadcrumb({        type: \\'http\\',        category: \\'xhr\\',        message: ``,        data: {          url: `${options.baseURL}${request}`,        },        level: \\'info\\',});

如果您的後端返回追蹤Id,您也可以使用哨兵添加標籤和上下文,以將錯誤與端點連結

onResponseError 您可以新增上下文麵包屑和標籤

import * as Sentry from \\'@sentry/vue\\';Sentry.setContext(\\'http-error\\', {   endpoint: response?.url,   tracingId: 123,   status: response?.status,});Sentry.addBreadcrumb({ type: \\'http\\', category: \\'xhr\\', message: ``, data: {  url: response?.url,  status_code: response?.status, }, level: \\'error\\',});Sentry.setTag(\\'tracingId\\', \\'123\\');

將tracingId替換為後端傳回的任何自訂追蹤日誌

","image":"http://www.luping.net/uploads/20241003/172795752666fe8a16368ef.png","datePublished":"2024-11-08T14:15:37+08:00","dateModified":"2024-11-08T14:15:37+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用攔截器自訂獲取並在 nuxt 3 中登錄

使用攔截器自訂獲取並在 nuxt 3 中登錄

發佈於2024-11-08
瀏覽:322

如果您使用過 Nuxt,您可能遇到過方便的 useFetch 可組合項目:



這簡化了資料獲取,但是如果您有大量都需要身份驗證的 API 怎麼辦? 為每個呼叫添加標頭很快就會變得乏味。

輸入攔截器。

為了添加全域攔截器,我們將圍繞 $fetch 建立一個自訂的可組合包裝器。當您的 API 呼叫始終需要授權標頭時,這尤其有價值。

作為基礎,讓我們使用我之前關於 Nuxt 3 中的身份驗證的部落格文章中的相同項目。

讓我們先在可組合資料夾 composables/useAuthFetch.ts 下建立一個新的可組合項目

import type { UseFetchOptions } from 'nuxt/app';

const useAuthFetch = (url: string | (() => string), options: UseFetchOptions = {}) => {
  const customFetch = $fetch.create({
    baseURL: 'https://dummyjson.com',
    onRequest({ options }) {
      const token = useCookie('token');
      if (token?.value) {
        console.log('[fetch request] Authorization header created');
        options.headers = options.headers || {};
        options.headers.Authorization = `Bearer ${token.value}`;
      }
    },
    onResponse({ response }) {
      console.info('onResponse ', {
        endpoint: response.url,
        status: response?.status,
      });
    },
    onResponseError({ response }) {
      const statusMessage = response?.status === 401 ? 'Unauthorized' : 'Response failed';
      console.error('onResponseError ', {
        endpoint: response.url,
        status: response?.status,
        statusMessage,
      });
      throw showError({
        statusCode: response?.status,
        statusMessage,
        fatal: true,
      });
    },
  });

  return useFetch(url, {
    ...options,
    $fetch: customFetch,
  });
};

export default useAuthFetch;

解釋:

  • useAuthFetch:我們的自訂可組合項。它採用與 useFetch 相同的參數。
  • customFetch:使用攔截器建立自訂的 $fetch 實例。
  • baseURL:透過使用 baseURL 選項,ofetch 將其新增至尾隨/前導斜杠,並使用 ufo:
  • 查詢 baseURL 的搜尋參數
  • onRequest:此攔截器在每次 fetch 呼叫之前運行。它從 cookie 中取得令牌,並在存在令牌時新增授權標頭。
  • onResponse:成功取得後運行,提供日誌記錄。
  • onResponseError:處理獲取錯誤,記錄詳細信息,並使用 showError 拋出錯誤(假設您已經定義了該錯誤)。
  • return useFetch(...):最後,我們呼叫原來的useFetch,但傳入我們的customFetch來處理實際的請求。

您可以在此處找到有關攔截器的更多資訊

現在,每當您需要從經過驗證的 API 取得資料時,只需使用 useAuthFetch 而不是 useFetch,授權將無縫處理。



Custom fetch with Interceptors and logs in nuxt 3

當您檢查網路呼叫時,您可以看到 baseUrl 是正確的並且存在 Authorization 標頭

記錄

在我的攔截器中,我添加了一些日誌,如果您的應用程式中有像 Sentry 這樣的工具,這些日誌會很有用。

如何將Sentry加入Nuxt:https://www.lichter.io/articles/nuxt3-sentry-recipe/

在 onRequest 攔截器中,您可以為哨兵添加麵包屑

import * as Sentry from '@sentry/vue';

Sentry.addBreadcrumb({
        type: 'http',
        category: 'xhr',
        message: ``,
        data: {
          url: `${options.baseURL}${request}`,
        },
        level: 'info',
});

如果您的後端返回追蹤Id,您也可以使用哨兵添加標籤和上下文,以將錯誤與端點連結

onResponseError 您可以新增上下文麵包屑和標籤

import * as Sentry from '@sentry/vue';

Sentry.setContext('http-error', {
   endpoint: response?.url,
   tracingId: 123,
   status: response?.status,
});
Sentry.addBreadcrumb({
 type: 'http',
 category: 'xhr',
 message: ``,
 data: {
  url: response?.url,
  status_code: response?.status,
 },
 level: 'error',
});
Sentry.setTag('tracingId', '123');

將tracingId替換為後端傳回的任何自訂追蹤日誌

版本聲明 本文轉載於:https://dev.to/rafaelmagalhaes/custom-fetch-with-interceptors-and-logs-in-nuxt-3-40lm?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的Python功能Eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。本文深入研究了eval()和ast.literal_eval()之間的差異,突出顯示其安全性含義...
    程式設計 發佈於2025-05-05
  • Java中假喚醒真的會發生嗎?
    Java中假喚醒真的會發生嗎?
    在Java中的浪費喚醒:真實性或神話? 在Java同步中偽裝喚醒的概念已經是討論的主題。儘管存在這種行為的潛力,但問題仍然存在:它們實際上是在實踐中發生的嗎? Linux的喚醒機制根據Wikipedia關於偽造喚醒的文章,linux實現了pthread_cond_wait()功能的Linux實現,...
    程式設計 發佈於2025-05-05
  • 如何有效地轉換PHP中的時區?
    如何有效地轉換PHP中的時區?
    在PHP 利用dateTime對象和functions DateTime對象及其相應的功能別名為時區轉換提供方便的方法。例如: //定義用戶的時區 date_default_timezone_set('歐洲/倫敦'); //創建DateTime對象 $ dateTime = ne...
    程式設計 發佈於2025-05-05
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-05-05
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-05-05
  • 在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在JTable中維護jtable單元格渲染後,在JTable中,在JTable中實現自定義單元格渲染和編輯功能可以增強用戶體驗。但是,至關重要的是要確保即使在編輯操作後也保留所需的格式。 在設置用於格式化“價格”列的“價格”列,用戶遇到的數字格式丟失的“價格”列的“價格”之後,問題在設置自定義單元...
    程式設計 發佈於2025-05-05
  • 為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    為什麼我會收到MySQL錯誤#1089:錯誤的前綴密鑰?
    mySQL錯誤#1089:錯誤的前綴鍵錯誤descript [#1089-不正確的前綴鍵在嘗試在表中創建一個prefix鍵時會出現。前綴鍵旨在索引字符串列的特定前綴長度長度,以便更快地搜索這些前綴。 理解prefix keys `這將在整個Movie_ID列上創建標準主鍵。主密鑰對於唯一識...
    程式設計 發佈於2025-05-05
  • 在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    在Java中使用for-to-loop和迭代器進行收集遍歷之間是否存在性能差異?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    程式設計 發佈於2025-05-05
  • MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    在兩個條件下插入或更新或更新 solution:的答案在於mysql的插入中...在重複鍵更新語法上。如果不存在匹配行或更新現有行,則此功能強大的功能可以通過插入新行來進行有效的數據操作。如果違反了唯一的密鑰約束。 實現所需的行為,該表必須具有唯一的鍵定義(在這種情況下為'名稱'...
    程式設計 發佈於2025-05-05
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    答案: 在大多數現代編譯器中,while(1)和(1)和(;;)之間沒有性能差異。編譯器: perl: 1 輸入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    程式設計 發佈於2025-05-05
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-05-05
  • 如何從2D數組中提取元素?使用另一數組的索引
    如何從2D數組中提取元素?使用另一數組的索引
    Using NumPy Array as Indices for the 2nd Dimension of Another ArrayTo extract specific elements from a 2D array based on indices provided by a second ...
    程式設計 發佈於2025-05-05
  • 如何使用Depimal.parse()中的指數表示法中的數字?
    如何使用Depimal.parse()中的指數表示法中的數字?
    在嘗試使用Decimal.parse(“ 1.2345e-02”中的指數符號表示法表示的字符串時,您可能會遇到錯誤。這是因為默認解析方法無法識別指數符號。 成功解析這樣的字符串,您需要明確指定它代表浮點數。您可以使用numbersTyles.Float樣式進行此操作,如下所示:[&& && && ...
    程式設計 發佈於2025-05-05
  • Java開發者如何保護數據庫憑證免受反編譯?
    Java開發者如何保護數據庫憑證免受反編譯?
    在java 在單獨的配置文件保護數據庫憑證的最有效方法中存儲憑據是將它們存儲在單獨的配置文件中。該文件可以在運行時加載,從而使登錄數據從編譯的二進製文件中遠離。 使用prevereness class import java.util.prefs.preferences; 公共類示例{ 首選...
    程式設計 發佈於2025-05-05
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中可能會遇到一個衝突,其中3派對軟件包將另一個帶有導入套件的path package the Imptioned package the Imptioned package the Imported tocted pac...
    程式設計 發佈於2025-05-05

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3