허용된 주입 컨텍스트 밖에서 inject 함수를 사용하려고 하면 이 오류가 발생합니다. 주입 컨텍스트는 클래스를 생성하고 초기화하는 동안 사용할 수 있습니다.
runInInjectionContext와 함께 사용하는 함수에서도 사용할 수 있습니다.
실제로 inject()는 생성자, 생성자 매개변수, 필드 초기화 코드에서 호출할 수 있습니다.
@Service()
export class Car {
radio: Radio | undefined;
// 정상: 필드 초기화 코드
spareTyre = inject(Tyre);
constructor() {
// 정상: 생성자 본문
this.radio = inject(Radio);
}
}
프로바이더의 팩토리에서도 inject를 호출할 수 있습니다.
providers: [
{
provide: Car,
useFactory: () => {
// 정상: 클래스 팩토리
const engine = inject(Engine);
return new Car(engine);
},
},
];
클래스 생성 과정이나 runInInjectionContext 밖에서 inject 함수를 호출하면 오류가 발생합니다. 특히 클래스 인스턴스가 생성된 이후에는 라이프사이클 훅을 포함한 메서드에서 inject()를 호출할 수 없습니다.
@Component({ ... })
export class Car {
ngOnInit() {
// 오류: 컴포넌트 인스턴스가 이미 생성되어 호출 시점이 너무 늦습니다.
const engine = inject(Engine);
engine.start();
}
}
오류 디버깅
오류의 스택 트레이스를 거슬러 올라가며 허용되지 않은 inject() 호출의 위치를 찾으세요.
오류를 해결하려면 inject 호출을 허용된 위치로 옮기세요. 보통 클래스 생성자나 필드 초기화 코드로 옮기면 됩니다.
NOTE: 테스트 컨텍스트에서 실행하는 경우 TestBed.runInInjectionContext를 사용하면 inject()를 정상적으로 호출할 수 있습니다.
TestBed.runInInjectionContext(() => {
// ...
});