[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

State
范围
详细信息
配置
进程
由configure设置一次。 每个句柄使用相同的配置。
访问令牌
进程
SDK在首次需要访问令牌时从Adobe请求访问令牌,然后将其重复用于每个句柄,直到令牌过期前不久。 请参阅身份验证。
网络、运行时、旧版和全局服务
进程
处理重复使用您传递到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