İçeriğe atla

İşletme

Hatalar ve yeniden denemeler

Düzeltilmesi gereken hataları yeniden denenmesi gereken hatalardan ayırt edin ve doğru şekilde bekleyerek yeniden deneyin.

Hatalar size iki şekilde ulaşır: bir oda açılamadığında createRoom() reddedilir, çalışan bir oda ise sorunları onError'a ve başarısız olan komutların promise'lerine bildirir.

Bir oda açılamadığında

HataNedenYeniden deneme?
TypeError: A valid API key is required.Eksik veya hatalı biçimli anahtarHayır: yapılandırmayı düzeltin
Error: Unknown room setting: … ve diğer ayar hatalarıGeçersiz createRoom() ayarlarıHayır: kodu düzeltin
RoomAdmissionError with status 400, 401, 403Ayarlar reddedildi, anahtar geçersiz veya anahtarın izni yokHayır
RoomAdmissionError with status 409 or 410İstek bayatladıEvet, yeni bir createRoom() çağrısı olarak
RoomAdmissionError with status 429Bir oda sınırı veya istek kotasıEvet, retryAfterSeconds sonrasında
RoomAdmissionError with status 503Servis geçici olarak kullanılamıyorEvet, bekleyerek yeniden deneme ile
TimeoutErrorBaşlatma 15 saniyeden uzun sürdüEvet, bekleyerek yeniden deneme ile
Signaling timed out, Host authority was not grantedBaşlatma sırasında sinyalleşme başarısız olduEvet, bekleyerek yeniden deneme ile

Hatalar referansı durum kodlarını ayrıntılı olarak listeler.

Bekleyerek yeniden deneyin

Yalnızca daha sonra başarılı olabilecek hataları yeniden deneyin, her başarısızlıktan sonra daha uzun bekleyin ve retryAfterSeconds'a uyun:

open-room.mjs
import { createRoom, RoomAdmissionError } from 'ball2d/node';

const permanent = new Set([400, 401, 403]);

export async function openRoom(config) {
  for (let attempt = 0; ; attempt++) {
    try {
      return await createRoom(config);
    } catch (error) {
      if (error instanceof TypeError) throw error;
      if (
        error instanceof RoomAdmissionError &&
        permanent.has(error.status)
      )
        throw error;
      const backoff =
        Math.min(60, 2 ** attempt) + Math.random();
      const wait = error.retryAfterSeconds ?? backoff;
      console.warn(
        `Room did not open (${error.message});` +
          ` retrying in ${Math.round(wait)} s`,
      );
      await new Promise((resolve) =>
        setTimeout(resolve, wait * 1000),
      );
    }
  }
}

Bir oda çalışırken

  • Başarısız komutlar promise'lerini reddeder ve oda bunları onError'a da bildirir. Başarısızlığın önemli olduğu yerde promise'i işleyin; örneğin servisin onaylamadığı bir yasaklama.
  • İşleyici hataları sürecinizi asla çökertmez. onError'a <event>: <error> biçiminde bildirilir.
  • Odanın sona ermesi, nedeniyle birlikte onError'a bildirilir ve room.signal iptal edilir. Bkz. bir odayı ne kapatır.

onError'ı her yerde kaydedin. Çalışan bir odadaki her sorunun ortaya çıktığı tek yer burasıdır:

JavaScript
room.onError = (message) =>
  logger.warn({ room: room.roomId, message }, 'room error');