Heim > Web-Frontend > js-Tutorial > Benutzerdefinierter Abruf mit Interceptors und Protokollen in Nuxt 3

Benutzerdefinierter Abruf mit Interceptors und Protokollen in Nuxt 3

PHPz
Freigeben: 2024-08-30 19:01:32
Original
529 Leute haben es durchsucht

Wenn Sie Nuxt verwendet haben, sind Sie wahrscheinlich auf das praktische useFetch composable:
gestoßen

<script setup lang="ts">
const { data, status, error, refresh, clear } = await useFetch('/api/modules')
</script>

Nach dem Login kopieren

Dies vereinfacht das Abrufen von Daten, aber was ist, wenn Sie über eine Vielzahl von APIs verfügen, die alle eine Authentifizierung erfordern? Das Hinzufügen von Headern zu jedem Anruf wird schnell mühsam.

Abfangjäger betreten.

Um globale Interceptoren hinzuzufügen, erstellen wir einen benutzerdefinierten zusammensetzbaren Wrapper um $fetch. Dies ist besonders wertvoll, wenn Ihre API-Aufrufe ständig Autorisierungsheader benötigen.

Als Grundlage verwenden wir dasselbe Projekt aus meinem vorherigen Blogbeitrag zur Authentifizierung in Nuxt 3.

Beginnen wir mit der Erstellung eines neuen Composable im Composable-Ordner composables/useAuthFetch.ts

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

const useAuthFetch = (url: string | (() => string), options: UseFetchOptions<null> = {}) => {
  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;
Nach dem Login kopieren

Erklärung:

  • useAuthFetch: Unser benutzerdefiniertes Composable. Es benötigt die gleichen Argumente wie useFetch.
  • customFetch: Erstellt eine benutzerdefinierte $fetch-Instanz mit Interceptoren.
  • baseURL: Durch die Verwendung der baseURL-Option stellt Ofetch sie für nachgestellte/führende Schrägstriche voran und sucht Suchparameter für baseURL mit ufo:
  • ab
  • onRequest: Dieser Interceptor wird vor jedem Abrufaufruf ausgeführt. Es holt sich das Token von einem Cookie und fügt den Authorization-Header hinzu, wenn ein Token vorhanden ist.
  • onResponse: Wird nach einem erfolgreichen Abruf ausgeführt und sorgt für die Protokollierung.
  • onResponseError: Behandelt Abruffehler, protokolliert Details und löst mithilfe von showError einen Fehler aus (vorausgesetzt, Sie haben dies definiert).
  • useFetch(...) zurückgeben: Schließlich rufen wir den ursprünglichen useFetch auf, übergeben aber unseren customFetch, um die tatsächlichen Anfragen zu verarbeiten.

Mehr über die Abfangjäger erfahren Sie hier

Wenn Sie jetzt Daten von einer authentifizierten API abrufen müssen, verwenden Sie einfach useAuthFetch anstelle von useFetch, und die Autorisierung wird nahtlos gehandhabt.

<template>
  <div v-if="user">Welcome back {{ user.email }}</div>
  <div v-else>loading...</div>
</template>
<script lang="ts" setup>
const { data: user } = await useAuthFetch('/auth/me');
</script>
Nach dem Login kopieren

Custom fetch with Interceptors and logs in nuxt 3

Wenn Sie den Netzwerkaufruf überprüfen, können Sie sehen, dass die baseUrl korrekt ist und der Autorisierungsheader vorhanden ist

Protokollierung

In meinen Interceptoren habe ich einige Protokolle hinzugefügt. Dies kann nützlich sein, wenn Sie Tools wie Sentry in Ihrer Anwendung haben.

So fügen Sie Sentry zu Nuxt hinzu: https://www.lichter.io/articles/nuxt3-sentry-recipe/

im onRequest-Interceptor können Sie einen Breadcrumb zu Sentry hinzufügen

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

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

Nach dem Login kopieren

Wenn Ihr Backend eine TracingId zurückgibt, können Sie mit Sentry auch ein Tag und einen Kontext hinzufügen, um Fehler mit einem Endpunkt zu verknüpfen

onResponseError können Sie Kontext-Breadcrumb und Tag hinzufügen

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');
Nach dem Login kopieren

Ersetzen Sie „tracingId“ durch das benutzerdefinierte Tracing-Protokoll, das Ihr Backend zurückgibt

Das obige ist der detaillierte Inhalt vonBenutzerdefinierter Abruf mit Interceptors und Protokollen in Nuxt 3. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage