請求處理

src/routes 目錄中的每個 layout.tsindex.ts 檔案都能夠存取目前的 HTTP 請求、回應和網址。這讓您可以擷取和修改資料,甚至以自訂內容回應。

Qwik City 根據 src/routes 目錄的層級結構實現了一個中介軟體系統。此中介軟體系統用於處理 HTTP 請求和回應,並且可供頁面、佈局和 端點 使用。

每個路由都可以添加 HTTP 請求和回應處理器,允許開發人員擷取和修改資料。這些處理器也可以由 端點 使用,這些端點只回應資料,而不是頁面的 HTML。

此功能使您能夠處理任何請求事件,在呈現元件並以自訂內容回應之前,對請求管道產生副作用。它適用於頁面、佈局和端點路由,但不適用於一般元件。

請求和回應處理器

在頁面、佈局和 端點 上,我們可以透過實作請求處理器函數(例如 onGetonPostonPut 等)來存取請求資料。這些函數會根據此路由使用的 HTTP 方法 執行。

此外,可以使用 onRequest 函數以 中介軟體 的形式處理任何請求方法,而不是特定方法。例如,如果同時提供了 onGetonRequest,則對於 GET 請求,將會呼叫 onGet。但是,在這種情況下,如果傳入 POST 請求方法,則會呼叫 onRequest 處理器,因為未提供 onPostonRequest 可作為任何沒有特定方法的請求方法的全面攔截。

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回應物件,可用於設定回應 headersstatus
urlURL,包含 pathnamehostname
next下一個中介軟體函數
abort請求中止函數
params在 URL 中找到的自訂使用者參數
cookie取得和設定 Cookie。
platform平台資料物件(適用於 Cloudflare、Netlify 等)
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 值是一個具有三個欄位的簡單記錄

  1. value:包含作為字串的 Cookie 值
  2. json():對值執行 JSON.parse() 並傳回結果
  3. 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');

貢獻者

感謝所有協助改進此份文件的人!

  • adamdbradley
  • manucorporat
  • mhevery
  • tzdesign
  • mrhoodz
  • hamatoyogi
  • jemsco