[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設定一次。 每個控制代碼都使用相同的設定。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服務介面實作。 請參閱平台服務。
sendEvent傳送的事件都必須在xdm.identityMap中包含主要身分。 ECID本身並不符合此要求。避免訪客流量的頂層例項 top-level
您可以直接在createInstance傳回的執行個體上呼叫sendEvent等方法。 這對於測試您的設定,或傳送不屬於特定訪客的事件而言,非常有用。 不過,最上層執行個體會在處理序的生命週期內保留單一記憶體中的Cookie存放區。 無論是由哪個訪客觸發,對其發出的每個呼叫都會共用相同的身分。 請改用每個訪客請求的forRequest控制代碼。