使用 Node.js SDK 取消本地等待
向 solve 传入 AbortController 的信号,以停止本地等待。在调用 SDK 前保存完整的任务输入,包括其 requestId,这样即使调用在收到任务 ID 之前结束,也能恢复。
本页内容
先保存请求,再传入信号
在 Node.js 22 或更高版本上使用官方 JavaScript SDK,并将 API 密钥保留在服务器端。将示例主机名和操作替换为目标值,配置有效的站点配置文件,并设置代理环境变量。
此示例在调用 solve 之前生成 requestId。请在调用前持久化保存该 ID 和未经更改的任务输入,而不只是放在错误处理器中保存。恢复时生成新 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.
保存一个测试请求
运行示例前,记录完整的任务输入及其 requestId。在整个测试期间保留这些值。
- 2.
观察首次调用如何结束
如果五秒定时器触发时操作仍在等待,请捕获产生的错误和恢复所需的 ID。就绪结果或终态失败可能先到达;这种情况下,该次运行并未测试取消操作。
- 3.
恢复同一个任务
使用上述恢复路径取得任务 ID,然后使用该 ID 调用 getTask,并将 waitMs 设为 15000。限制获取尝试次数,或设置本地测试截止时间。如果达到限制时任务仍为 pending 或 solving,请保留其 ID 以便稍后恢复,而不是创建另一个任务。
只要原始任务 ID 已知,就应检查恢复操作是否返回了该 ID。这是在检查本地取消和任务恢复,而不是检查目标网站是否接受生成的令牌。
来源与 API 参考
运行您的第一个任务。
使用 $5 工作区额度开始体验。