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
| Hata | Neden | Yeniden deneme? |
|---|---|---|
TypeError: A valid API key is required. | Eksik veya hatalı biçimli anahtar | Hayı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, 403 | Ayarlar reddedildi, anahtar geçersiz veya anahtarın izni yok | Hayır |
RoomAdmissionError with status 409 or 410 | İstek bayatladı | Evet, yeni bir createRoom() çağrısı olarak |
RoomAdmissionError with status 429 | Bir oda sınırı veya istek kotası | Evet, retryAfterSeconds sonrasında |
RoomAdmissionError with status 503 | Servis geçici olarak kullanılamıyor | Evet, bekleyerek yeniden deneme ile |
TimeoutError | Başlatma 15 saniyeden uzun sürdü | Evet, bekleyerek yeniden deneme ile |
Signaling timed out, Host authority was not granted | Başlatma sırasında sinyalleşme başarısız oldu | Evet, 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 veroom.signaliptal edilir. Bkz. bir odayı ne kapatır.
onError'ı her yerde kaydedin. Çalışan bir odadaki her sorunun ortaya çıktığı tek yer burasıdır:
room.onError = (message) =>
logger.warn({ room: room.roomId, message }, 'room error');