請求處理
src/routes
目錄中的每個 layout.ts
和 index.ts
檔案都能夠存取目前的 HTTP 請求、回應和網址。這讓您可以擷取和修改資料,甚至以自訂內容回應。
Qwik City 根據 src/routes
目錄的層級結構實現了一個中介軟體系統。此中介軟體系統用於處理 HTTP 請求和回應,並且可供頁面、佈局和 端點 使用。
每個路由都可以添加 HTTP 請求和回應處理器,允許開發人員擷取和修改資料。這些處理器也可以由 端點 使用,這些端點只回應資料,而不是頁面的 HTML。
此功能使您能夠處理任何請求事件,在呈現元件並以自訂內容回應之前,對請求管道產生副作用。它適用於頁面、佈局和端點路由,但不適用於一般元件。
請求和回應處理器
在頁面、佈局和 端點 上,我們可以透過實作請求處理器函數(例如 onGet
、onPost
、onPut
等)來存取請求資料。這些函數會根據此路由使用的 HTTP 方法 執行。
此外,可以使用 onRequest
函數以 中介軟體 的形式處理任何請求方法,而不是特定方法。例如,如果同時提供了 onGet
和 onRequest
,則對於 GET
請求,將會呼叫 onGet
。但是,在這種情況下,如果傳入 POST
請求方法,則會呼叫 onRequest
處理器,因為未提供 onPost
。onRequest
可作為任何沒有特定方法的請求方法的全面攔截。
import type { RequestHandler } from '@builder.io/qwik-city';
export const onGet: RequestHandler<ProductData> = async ({ params }) => {
// put your DB access here (hard coding data for simplicity)
return {
skuId: params.skuId,
price: 123.45,
description: `Description for ${params.skuId}`,
};
};
請求事件
請求處理器函數會接收一個 RequestEvent
引數,該引數具有以下屬性
欄位 | 說明 |
---|---|
request | 請求物件 |
response | 回應物件,可用於設定回應 headers 和 status |
url | URL,包含 pathname 、hostname 等 |
next | 下一個中介軟體函數 |
abort | 請求中止函數 |
params | 在 URL 中找到的自訂使用者參數 |
cookie | 取得和設定 Cookie。 |
platform | 平台資料物件(適用於 Cloudflare、Netlify 等) |
Cookie
interface Cookie {
get: (key: string) => CookieValue | null;
set: (key: string, value: string | number | Record<string, any>, options?: CookieOptions) => void;
delete: (key: string) => void;
has: (key: string) => boolean;
}
get 採用包含 Cookie 名稱的字串,並傳回 CookieValue
(如果存在),如果不存在則傳回 null。
interface CookieValue {
value: string;
json: <T = unknown>() => T;
number: () => number;
}
Cookie 值是一個具有三個欄位的簡單記錄
value
:包含作為字串的 Cookie 值json()
:對值執行JSON.parse()
並傳回結果number()
:對值執行Number()
並傳回結果
getAll 傳回一個包含所有 Cookie 的物件(如果有的話)。*如果 Cookie 名稱未知且必須經過解析,則有時需要這樣做。*
set 採用鍵和值,並建立一個將附加到回應的標頭。值可以是 string | number | Record<string, any>
作為第三個引數,您可以選擇提供 CookieOptions
記錄來設定其他欄位。
export interface CookieOptions {
domain?: string;
expires?: Date | string;
httpOnly?: boolean;
maxAge?: number | [number, 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks'];
path?: string;
sameSite?: 'lax' | 'none' | 'strict';
secure?: boolean;
}
有關這些屬性及其值的詳細資訊,請參閱有關 Set-Cookie 標頭的 MDN 文章。
delete 將具有提供的鍵的標頭附加到 Cookie。新的標頭將在 expires
欄位中包含一個過期日期,告知瀏覽器移除它。
cookie.delete('my-cookie');
// equivalent to
cookie.set('my-cookie', 'deleted', new Date(0));
// or
cookie.set('my-cookie', '');
或者,您可以在刪除 Cookie 時設定路徑、sameSite 和/或網域。如果您的 Cookie 是使用路徑/網域建立的,則必須設定這些欄位才能生效刪除。
cookie.delete('my-cookie', { domain: 'https://qwik.dev.org.tw', path: '/docs/' });
has 一種便捷方法,根據 Cookie 中是否存在提供的鍵傳回 true 或 false。
cookie.has('my-cookie');