使用 Node.js SDK 取消本地等待

作者:solvethree阅读需 1 分钟

向 solve 传入 AbortController 的信号,以停止本地等待。在调用 SDK 前保存完整的任务输入,包括其 requestId,这样即使调用在收到任务 ID 之前结束,也能恢复。

本页内容

先保存请求,再传入信号

在 Node.js 22 或更高版本上使用官方 JavaScript SDK,并将 API 密钥保留在服务器端。将示例主机名和操作替换为目标值,配置有效的站点配置文件,并设置代理环境变量。

此示例在调用 solve 之前生成 requestId。请在调用前持久化保存该 ID 和未经更改的任务输入,而不只是放在错误处理器中保存。恢复时生成新 ID 会丢失与原始请求的关联。

Node.js · 取消操作并保留恢复 ID
import { randomUUID } from 'node:crypto';
import { Solvethree, SolvethreeError, TaskFailedError } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const task = { site: 'accounts.example.com', action: 'login', proxy: process.env.SOLVETHREE_PROXY, requestId: randomUUID() };
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 5000);
try {
  const result = await client.solve(task, { signal: controller.signal, timeoutMs: 180000 });
  console.log('Ready task:', result.id);
  // Submit this result with its browser identity and original proxy.
} catch (error) {
  if (error instanceof TaskFailedError) {
    console.error('Failed task:', error.taskId, error.errorCode);
  } else if (error instanceof SolvethreeError) {
    console.error('Recovery IDs:', error.requestId ?? task.requestId, error.taskId);
    // If taskId exists, retrieve it. Otherwise replay the unchanged task with
    // this requestId. Canceling local waiting did not cancel the remote task.
  }
  throw error;
} finally { clearTimeout(timer); }

五秒定时器调用 abort;signal 将该控制器与 SDK 操作关联起来。独立的 timeoutMs 值将求解时限设为 180 秒。两者都可能结束等待,因此应为这两种情况保留恢复信息。如果操作先完成,finally 块会清除定时器。

使用已有的 ID 恢复

catch 块会记录恢复所需的 ID 并重新抛出错误,不会恢复任务。调用方需要保留这些 ID,并选择适当的恢复路径。

  • 终态失败:像示例一样,先处理 TaskFailedError。检查 errorCode 和错误消息,然后停止轮询该失败任务。
  • 已知任务 ID:如果存在 SolvethreeError.taskId,请使用同一个 ID 调用 getTask,恢复获取任务。不要仅为了恢复轮询而再次调用 solve。
  • 没有任务 ID:将已保存且未经更改的任务连同相同的 requestId 传给 createTask,恢复创建操作。如果错误中包含 requestId,则使用它;否则使用调用前保存的 ID。连接中断并不能证明创建失败。

使用相同的 requestId 重放完全相同的输入会返回现有任务。复用该 ID 时更改输入会产生冲突,因此恢复期间不要更改代理、主机名或操作。

获取任务时,pending 和 solving 表示应在选定的本地时限内继续等待。只有 ready 包含可用的解决方案。遇到 failed 时停止,并检查其错误详情。

在有限等待时间内测试取消和恢复

  1. 1.

    保存一个测试请求

    运行示例前,记录完整的任务输入及其 requestId。在整个测试期间保留这些值。

  2. 2.

    观察首次调用如何结束

    如果五秒定时器触发时操作仍在等待,请捕获产生的错误和恢复所需的 ID。就绪结果或终态失败可能先到达;这种情况下,该次运行并未测试取消操作。

  3. 3.

    恢复同一个任务

    使用上述恢复路径取得任务 ID,然后使用该 ID 调用 getTask,并将 waitMs 设为 15000。限制获取尝试次数,或设置本地测试截止时间。如果达到限制时任务仍为 pending 或 solving,请保留其 ID 以便稍后恢复,而不是创建另一个任务。

只要原始任务 ID 已知,就应检查恢复操作是否返回了该 ID。这是在检查本地取消和任务恢复,而不是检查目标网站是否接受生成的令牌。

运行您的第一个任务。

使用 $5 工作区额度开始体验。

创建工作区
使用 Node.js SDK 取消本地等待 · solvethree