====== TRPC ======
:!: 搭配 express 使用的时候,必须 ''%%app.use(express.json())%%''; 否则mutation的时候 req.body 是空的。
===== 注意要点 =====
- 必须明确返回string或者int等基本类型,client端才会出现Outpu的定义。
- 错误类型可以这样判断:''%%err instanceof TRPCClientError%%''
===== Client side =====
实现中间件
import { Injectable } from '@angular/core';
import { TRPCClient, TRPCRequest, TRPCResponse } from '@trpc/client';
@Injectable({ providedIn: 'root' })
export class TRPCClientService {
private clientApp: TRPCClient; // TRouter ist der Typ Ihres TRPC-Routers
constructor() {
// Erstellen der TRPC-Client-Instanz
this.clientApp = createTRPCProxyClient({
links: [
// Fügen Sie Ihren HTTP-Link hinzu
// Hier können Sie den HTTP-Interceptoren-Ketten hinzufügen
// um den Bearer-Token zu überprüfen und zu aktualisieren
(request: TRPCRequest, next: (req: TRPCRequest) => Promise) => {
// Überprüfen, ob der Bearer-Token abgelaufen ist
const isTokenExpired = this.isTokenExpired();
// Wenn der Token abgelaufen ist, aktualisieren Sie ihn
if (isTokenExpired) {
// Führen Sie den Aktualisierungsprozess für den Bearer-Token durch
// z. B. durch einen API-Aufruf, um einen neuen Token zu erhalten
// und aktualisieren Sie den Authorization-Header im request-Objekt
// mit dem neuen Token
const newToken = this.refreshToken(); // Beispiel für einen Funktion, um den Token zu aktualisieren
request.headers.Authorization = `Bearer ${newToken}`;
}
// Weitergeben der Anfrage an den nächsten Interceptor oder an den HTTP-Link
return next(request);
},
// Fügen Sie Ihren HTTP-Link hinzu
httpBatchLink({
url: 'http://localhost:3003/api',
headers: {
Authorization: `Bearer xxxxxxxxYYYYY`,
},
}),
],
});
}
// Methode, um zu überprüfen, ob der Bearer-Token abgelaufen ist
private isTokenExpired(): boolean {
// Implementieren Sie hier Ihre Logik zur Überprüfung des Ablaufdatums des Tokens
// und geben Sie true zurück, wenn der Token abgelaufen ist, andernfalls false
// Beispiel: Vergleich des aktuellen Datums mit dem Ablaufdatum des Tokens
const tokenExpirationDate = new Date(localStorage.getItem('tokenExpirationDate'));
const currentDate = new Date();
return currentDate > tokenExpirationDate;
}
// Methode, um den Bearer-Token zu aktualisieren
private refreshToken(): string {
// Implementieren Sie hier Ihren Prozess zur Aktualisierung des Bearer-Tokens
// und geben Sie den neuen Token zurück
// Beispiel: Aufruf eines API-Endpunkts, um einen neuen Token zu erhalten
const newToken = 'newTokenValue'; // Beispiel für einen neuen Token
localStorage.setItem('accessToken', newToken); // Aktualisieren Sie den Token in Ihrem Speicher
return newToken;
}
// Getter für die TRPC-Client-Instanz
get client(): TRPCClient {
return this.clientApp;
}
}