這簡化了資料獲取,但是如果您有大量都需要身份驗證的 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
瀏覽:896

如果您使用過 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]刪除
最新教學 更多>
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-04-18
  • 如何使用PHP從XML文件中有效地檢索屬性值?
    如何使用PHP從XML文件中有效地檢索屬性值?
    從php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    程式設計 發佈於2025-04-18
  • 解決Hibernate“對象引用未保存的臨時實例”錯誤方法
    解決Hibernate“對象引用未保存的臨時實例”錯誤方法
    當實體具有包含尚未保存到數據庫的新實例時,就會出現此錯誤。 Hibernate嘗試在持續存在父對象時自動保存這些新實例,但是如果cascade屬性不能適當設置。解決此問題,您需要指定cascade atteribute interction interclibute。這會告訴Hibernate保存...
    程式設計 發佈於2025-04-18
  • Python不會對超範圍子串切片報錯的原因
    Python不會對超範圍子串切片報錯的原因
    在python中用索引切片範圍:二重性和空序列索引單個元素不同,該元素會引起錯誤,切片在序列的邊界之外沒有。 這種行為源於索引和切片之間的基本差異。索引一個序列,例如“示例” [3],返回一個項目。但是,切片序列(例如“示例” [3:4])返回項目的子序列。 索引不存在的元素時,例如“示例” [9...
    程式設計 發佈於2025-04-18
  • Java中Lambda表達式為何需要“final”或“有效final”變量?
    Java中Lambda表達式為何需要“final”或“有效final”變量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    程式設計 發佈於2025-04-18
  • 如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    在Visual Studio 2012 儘管已安裝了MySQL Connector v.6.5.4,但無法將MySQL數據庫添加到實體框架的“ DataSource對話框”中。為了解決這一問題,至關重要的是要了解MySQL連接器v.6.5.5及以後的6.6.x版本將提供MySQL的官方Visual...
    程式設計 發佈於2025-04-18
  • 如何在GO編譯器中自定義編譯優化?
    如何在GO編譯器中自定義編譯優化?
    在GO編譯器中自定義編譯優化 GO中的默認編譯過程遵循特定的優化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    程式設計 發佈於2025-04-18
  • 從C#正確調用SQL自定義函數(UDF)方法
    從C#正確調用SQL自定義函數(UDF)方法
    在C#中調用SQL定義的SQL定義已定義的函數在使用C#代碼的SQL定義的函數中查詢數據庫。這是您可以從C#代碼中調用名為“ TCUPOM”的T-SQL標量函數的方法: c#代碼: 原始代碼中的錯誤:Setting the CommandType to StoredProcedure when ...
    程式設計 發佈於2025-04-18
  • 如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在Java中正確顯示“ DD/MM/YYYY HH:MM:SS.SS”格式的當前日期和時間?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解決方案:的,請訪問量很大,並應為procectiquiestate的,並在整個代碼上正確格式不多: java.text.simpledateformat; 導入java.util.calendar; 導入java...
    程式設計 發佈於2025-04-18
  • 為什麼HTML無法打印頁碼及解決方案
    為什麼HTML無法打印頁碼及解決方案
    無法在html頁面上打印頁碼? @page規則在@Media內部和外部都無濟於事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: ...
    程式設計 發佈於2025-04-18
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-04-18
  • Go模板範圍中如何避免尾隨逗號?
    Go模板範圍中如何避免尾隨逗號?
    在GO的文本模板中的最後一個元素的特殊情況處理處理範圍的最後一個元素時,可能很棘手。以創建類似“(P1,P2,P3)”之類的字符串的任務。如果您使用一個簡單的範圍循環,則最終可能會在末端獲得一個額外的逗號,從而導致“(P1,P2,P3,)”。 來解決此問題,我們可以利用模板範圍的關鍵功能:聲明兩...
    程式設計 發佈於2025-04-18
  • 如何實現文本框自動高度調整?
    如何實現文本框自動高度調整?
    textarea auto height 探索如何自動調整文本核心的高度以匹配其內容的長度,以符合其內容的長度他們包含的文本量。如果文本超過預定義的高度,它將變得無法訪問並需要滾動。 此處提供的解決方案使用純JavaScript根據其實際內容來調整文本方面的高度。定義了一個稱為“ auto_gr...
    程式設計 發佈於2025-04-18
  • Python元類工作原理及類創建與定制
    Python元類工作原理及類創建與定制
    python中的metaclasses是什麼? Metaclasses負責在Python中創建類對象。就像類創建實例一樣,元類也創建類。他們提供了對類創建過程的控制層,允許自定義類行為和屬性。 在Python中理解類作為對象的概念,類是描述用於創建新實例或對象的藍圖的對象。這意味著類本身是使用...
    程式設計 發佈於2025-04-18
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-04-18

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

Copyright© 2022 湘ICP备2022001581号-3