[Alpha]{class="badge informative"}

例項和請求

在瀏覽器中,每次載入頁面都會開始為單一訪客提供新的Web SDK復本。 伺服器不同。 一個長時間執行的程式通常會同時處理許多訪客的請求。 伺服器SDK將每個程式發生一次的工作與每個訪客請求發生的工作分開:

  • 每個處理序一次:建立執行個體,並在伺服器啟動時呼叫configure。
  • 每個要求一次:呼叫forRequest以取得範圍為提出要求的訪客的控制代碼,然後呼叫該控制代碼上的sendEvent等方法。

伺服器啟動時設定一次 configure-once

在伺服器開始接受請求之前,先建立一個執行個體並加以設定。 等待configure解決,因為如果您在組態完成之前呼叫forRequest,便會擲回錯誤。

import { createInstance } from "@adobe/alloy-node";

const alloy = createInstance();

await alloy.configure({
  datastreamId: "ebebf826-a01f-4458-8cec-ef61de241c93",
  orgId: "ADB3LETTERSANDNUMBERS@AdobeOrg",
  edgeCredentials: {
    clientId: process.env.ADOBE_CLIENT_ID,
    clientSecret: process.env.ADOBE_CLIENT_SECRET,
    scopes: process.env.ADOBE_SCOPES.split(",")
  }
});

例如,如果configure因為選項無效而拒絕,執行個體會保持未設定狀態,forRequest會持續擲回,直到呼叫configure成功。

呼叫每個請求的forRequest for-request

對於每個傳入要求,請呼叫forRequest並傳遞傳入要求物件。 傳回的控制代碼與執行個體具有相同的方法,除了configure和forRequest。

下列範例使用Node.js內建node:http模組。 相同的模式適用於任何提供傳入要求物件的架構,例如Express或Fastify。

import { createServer } from "node:http";

createServer(async (req, res) => {
  const visitor = alloy.forRequest({ request: req });

  try {
    await visitor.sendEvent({
      xdm: {
        eventType: "web.webpagedetails.pageViews",
        identityMap: {
          Email: [{ id: "visitor@example.com", primary: true }]
        }
      }
    });
  } catch (error) {
    console.error("Failed to send event to Adobe", error);
  }

  res.end("OK");
}).listen(3000);

如果您的執行階段或架構將Fetch API Request傳遞給處理常式,並預期傳回Response,請使用相同的模式。 以您的執行階段或架構所需的方式登入處理常式:

async function handleRequest(request) {
  const visitor = alloy.forRequest({ request });

  try {
    await visitor.sendEvent({
      xdm: {
        eventType: "web.webpagedetails.pageViews",
        identityMap: {
          Email: [{ id: "visitor@example.com", primary: true }]
        }
      }
    });
  } catch (error) {
    console.error("Failed to send event to Adobe", error);
  }

  return new Response("OK");
}

每個控制代碼都有各自的SDK執行個體支援,這些執行個體設定了您傳遞至configure的相同選項。 控制代碼不會彼此共用訪客狀態,因此一個訪客的身分或同意不會洩漏到另一個訪客的請求。

傳遞request可讓SDK將訪客的標頭(例如User-Agent、Accept-Language和X-Forwarded-For)轉送至Edge Network。 請參閱內容與轉送的標頭。

共用的內容與每個請求的內容 scope

狀態
範圍
詳細資料
設定
處理
由configure設定一次。 每個控制代碼都使用相同的設定。
存取權杖
處理
SDK在第一次需要Adobe存取權杖時,會向其中要求Token,然後對每個控點重複使用它,直到它過期前不久。 請參閱驗證。
網路、執行階段、舊版及全域服務
處理
處理重複使用您傳給createInstance的任何平台服務,除非您在forRequest中覆寫它們。
身分(ECID)和同意
Visitor
讀取並寫入您傳遞至forRequest的cookie服務。
儲存空間
請求
除非您將storage服務傳遞給forRequest,否則每個控制代碼都會取得新的記憶體內部存放區。
請求標頭
請求
從您傳遞給forRequest的request讀取。

跨請求的身分和同意 identity

SDK會將訪客的Experience Cloud ID (ECID)和同意偏好設定儲存在Cookie中,與Web SDK相同。 在伺服器上,SDK會透過​ Cookie服務 ​讀取及寫入這些Cookie,而您會將該服務作為cookie屬性傳遞給forRequest。

  • 如果您未傳遞cookie服務,每個控制代碼都會以空的記憶體內Cookie存放區開頭。 Edge Network會在每個請求上指派新的ECID,而訪客的下一個請求不會記住您使用setConsent設定的同意。
  • 如果您在訪客的每個請求中傳遞相同的Cookie資料,SDK會將儲存的身分識別傳送至Edge Network,讓訪客保留相同的ECID。 同意偏好設定也會延續。

SDK不包含讀取和寫入HTTP Cookie和Set-Cookie標頭的Cookie服務。 為了在不同請求中保留訪客的身分和同意,請提供您自己的Cookie服務介面實作。 請參閱平台服務。

NOTE
無論您是否傳遞Cookie服務,sendEvent傳送的事件都必須在xdm.identityMap中包含主要身分。 ECID本身並不符合此要求。

避免訪客流量的頂層例項 top-level

您可以直接在createInstance傳回的執行個體上呼叫sendEvent等方法。 這對於測試您的設定,或傳送不屬於特定訪客的事件而言,非常有用。 不過,最上層執行個體會在處理序的生命週期內保留單一記憶體中的Cookie存放區。 無論是由哪個訪客觸發,對其發出的每個呼叫都會共用相同的身分。 請改用每個訪客請求的forRequest控制代碼。

recommendation-more-help
experience-platform-help-collection