Отмена локального ожидания в Node.js SDK
Передайте сигнал AbortController в solve, чтобы остановить локальное ожидание. До вызова SDK сохраните полные входные данные задачи, включая её requestId, чтобы восстановить работу, даже если вызов завершится до получения ID задачи.
На этой странице
Сохраните запрос, затем передайте сигнал
Используйте официальный SDK JavaScript в Node.js 22 или новее и храните ключ API на сервере. Замените имя хоста и действие из примера на свои целевые значения, настройте активный профиль сайта и задайте переменную окружения для прокси.
Пример генерирует requestId до вызова solve. Сохраните этот 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, возобновите получение черезgetTaskс тем же ID. Не вызывайтеsolveповторно только ради возобновления опроса. - ID задачи отсутствует: Восстановите результат создания, передав сохранённую неизменённую задачу в
createTaskс тем жеrequestId. ИспользуйтеrequestIdиз ошибки, если он доступен, иначе — ID, сохранённый до вызова. Прерванное соединение не доказывает, что создание завершилось неудачей.
Повторная отправка идентичных входных данных с тем же requestId возвращает существующую задачу. Изменение входных данных при повторном использовании этого ID вызывает конфликт, поэтому не меняйте прокси, имя хоста или действие при восстановлении.
При получении задачи статусы pending и solving означают, что нужно продолжать ожидание в пределах выбранного локального ограничения. Только ready содержит пригодное для использования решение. При failed остановитесь и изучите сведения об ошибке.
Проверьте отмену и восстановление с ограниченным ожиданием
- 1.
Сохраните один тестовый запрос
Запишите полные входные данные задачи и её requestId до запуска примера. Сохраняйте эти значения на протяжении всего теста.
- 2.
Проверьте, как завершится первый вызов
Если на момент срабатывания таймера на пять секунд операция всё ещё ожидает, сохраните возникшую ошибку и ID для восстановления. Готовый результат или окончательный сбой могут прийти раньше; такой запуск не проверяет отмену.
- 3.
Возобновите работу с той же задачей
Используйте описанный выше путь восстановления, чтобы получить ID задачи, затем вызовите getTask с этим ID и значением waitMs 15000. Ограничьте число попыток получения или задайте локальный срок завершения теста. Если при достижении ограничения задача всё ещё имеет статус pending или solving, сохраните её ID для последующего возобновления, а не создавайте новую задачу.
Проверьте, что восстановление возвращает исходный ID задачи, если он уже был известен. Это проверяет локальную отмену и восстановление задачи, а не то, принимает ли целевой сайт полученный токен.
Источники и справочник API
Запустите первую задачу.
Начните с $5 на балансе рабочего пространства.