Hata Ansiklopedisi

Geçersiz Enjeksiyon Token'ı

Bu hata, Angular bağımlılık enjeksiyonu sırasında bir sınıf için bir bağımlılığı çözemediğinde oluşur. Bu en çok constructor enjeksiyonu kullanan sınıfları etkiler; burada Angular parametre türlerini belirlemek için TypeScript metadata'sına dayanır.

En yaygın nedenler şunlardır:

  1. Bir servis sınıfında @Service() veya @Injectable dekoratörü eksik
  2. Bir InjectionToken için uygun sağlayıcı tanımı yok
  3. Bir constructor parametresi çözümlenemiyor

NOTE: inject() fonksiyonu açık bir token alır, bu nedenle "çözümlenemeyen parametre" senaryosu doğrudan ona uygulanmaz. Ancak enjekte edilen sınıfın kendisinde @Service() eksikse ve kendi constructor bağımlılıkları varsa, hata yine de oluşabilir.

Yaygın senaryolar

Eksik @Service() dekoratörü

Bir sınıfın constructor bağımlılıkları olduğu halde @Service() dekoratörü olmadığında, Angular parametrelerini çözümleyemez:

Missing @Service() decorator

export class UserClient {
  constructor(private http: HttpClient) {} // Angular bunu çözümleyemez
}

Bunu düzeltmek için @Service() dekoratörünü ekleyin:

@Service()
export class UserClient {
  constructor(private http: HttpClient) {}
}

Çözümlenemeyen constructor parametreleri

Bu hata ayrıca Angular bir constructor parametresinin türünü belirleyemediğinde de ortaya çıkar:

@Service()
export class DataStore {
  // Angular bir sağlayıcı olmadan 'config'i çözümleyemez
  constructor(private config: AppConfig) {}
}

Tüm constructor parametrelerinin ya yapılandırılmış sağlayıcılarının olduğundan ya da isteğe bağlı bağımlılıklar için @Optional() kullandığından emin olun.

Hatayı ayıklama

Hata mesajı hangi token'ın çözümlenemediğine dair ayrıntılar içerir:

  • Can't resolve all parameters for X: (?, ?, ?)? işaretleri çözümlenemeyen parametreleri gösterir. Sınıfın @Service veya @Injectable() dekoratörüne sahip olduğunu ve tüm bağımlılıkların sağlayıcılarının bulunduğunu kontrol edin.
  • Token X is missing a ɵprov definition — Bir InjectionToken sağlayıcı yapılandırılmadan kullanılmış. Token'ı {provide: TOKEN, useValue: ...} kullanarak bir değerle kaydedin veya token tanımına varsayılan bir factory ekleyin.

Hatanın yığın izinden geriye doğru çalışarak sorunlu enjeksiyonun nerede gerçekleştiğini belirleyin, ardından şunları doğrulayın:

  1. Sınıfın @Service veya @Injectable() dekoratörüne sahip olduğunu
  2. Tüm constructor parametrelerinin kayıtlı sağlayıcılarının bulunduğunu
  3. Herhangi bir InjectionToken'ın yapılandırılmış bir sağlayıcıya veya varsayılan değere sahip olduğunu