2
votes

NullInjectorError: Aucun fournisseur pour function () {}!

C'est mon dernier recours après plusieurs heures de configuration d'un AOT personnalisé dans un projet Angular 7 sans CLI et débogage, j'ai eu

import 'core-js/es7/reflect';
import 'zone.js/dist/zone';

import { platformBrowser } from '@angular/platform-browser';
import { AppModule } from './app/app.module';

/**
 * Enable production mode. Disable Angular's development mode, which turns off assertions and other
 * checks within the framework.
 */
import { enableProdMode } from '@angular/core';

// enable production mode and thus disable debugging information
enableProdMode();

platformBrowser().bootstrapModule(<any>AppModule)
  .catch(err => console.error(err));

Ceci est mon app.module.ts p >

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Response } from '@angular/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AppService {
  theme: string = '';

  constructor (private http: HttpClient) { }

  setSidebarPref(obj: object): Observable<any> {
    return this.http.put('../api/v1.0/users/me/preferences', { 'batch' : obj }, { withCredentials: true } );
  }

  getUserImage(): Observable<any> {
    return this.http.get('../api/v1.0/users/me/image', { responseType: 'blob', withCredentials: true });
  }

  getLayoutPreferences(): Observable<any> {
    return this.http.get('../api/v1.0/properties/layout', { withCredentials: true });
  }

  handleError(error: Response) {
    console.log(error);
    return Observable.throw(error.json().error || 'Server error');
  }
}

Ceci est mon composant

import { Component, OnInit } from '@angular/core';
import { AppService } from './services/app.service';
import { TranslateService } from '@ngx-translate/core';

@Component({
  selector: 'kpi-main',
  templateUrl: './app.component.html'
})
export class AppComponent implements OnInit {
  theme: string;
  sidebarPref: object = {};
  stickyHeader: string = '';
  user: object = {};

  constructor (private appService: AppService, private translate: TranslateService) {
    // this language will be used as a fallback when a translation isn't found in the current language
    translate.setDefaultLang('en');
     // the lang to use, if the lang isn't available, it will use the current loader to get them
    translate.use('en');
  }

  ngOnInit(): void {
    this.appService.getLayoutPreferences().subscribe(layout => {
      this.theme = layout.theme.value;
      this.sidebarPref = layout.sidebar_small;
      this.stickyHeader = layout.stickyHeader.visible;
      this.user = layout.sidebar_small.user;
    });
  }
}

et mon service est

import { AppComponent } from './app.component';
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClient, HttpClientModule } from '@angular/common/http';
import { InlineSVGModule } from 'ng-inline-svg';
import { APP_BASE_HREF } from '@angular/common';
import { TranslateModule, TranslateLoader } from '@ngx-translate/core';
import { FeatureRoutingModule } from './app-routing.module';
/**
 * Core
 */
import { HeaderComponent } from './core/header/header.component';
import { AppSettingsComponent } from './core/header/app-settings/app-settings.component';
import { SidebarComponent } from './core/sidebar/sidebar.component';
import { PreloaderComponent } from './core/preloader/preloader.component';
import { TranslationLoader } from './services/translation.service';
/**
 * Shared
 */
import { PopupsDirective } from './shared/popups/popups.directive';
/**
 * Component
 */
import { StructureComponent } from './component/structure/structure.component';
import { OverviewComponent } from './component/overview/overview.component';
import { MainContentComponent } from './component/main-content/main-content.component';
import { NavigationStripeComponent } from './component/main-content/navigation-stripe/navigation-stripe.component';
import { TestDirective } from './component/tooltip/serviceCalls.directive';
import { TooltipService } from './component/tooltip/tooltip.service';
import { TooltipComponent } from './component/tooltip/tooltip.component';

export function HttpLoaderFactory(http: HttpClient) {
  return new TranslationLoader(http);
}

@NgModule({
  // rendering in browser environment
  imports: [
    BrowserModule,
    FeatureRoutingModule,
    TranslateModule.forRoot({
      loader: {
        provide: TranslateLoader,
        useFactory: (HttpLoaderFactory),
        deps: [HttpClient]
      }
    }),
    InlineSVGModule.forRoot(),
    HttpClientModule
  ],
  // register services at root level
  providers: [
    TooltipService,
    { provide: APP_BASE_HREF, useValue: `${window['_app_base']}/` || '/' }
  ],
  // components declarations
  declarations: [
    AppComponent,
    HeaderComponent,
    AppSettingsComponent,
    SidebarComponent,
    PreloaderComponent,
    StructureComponent,
    OverviewComponent,
    MainContentComponent,
    TestDirective,
    TooltipComponent,
    PreloaderComponent,
    PopupsDirective,
    NavigationStripeComponent
  ],
  // bootstrap component
  bootstrap: [AppComponent]
})
export class AppModule {
}

Ce code sur mon application reçoit l'exception Null-injector que vous avez vue dans le lien en haut de ma question. Et cette erreur n'est générée que lors de l'exécution en mode production (j'ai désactivé UglifyJsPlugin pour obtenir un meilleur message d'erreur mais on ne sait toujours pas ce qui ne va pas)

Quelqu'un peut-il me dire ce que je manque sur mes fichiers dans pour avoir une configuration de service réussie?

PS: Faites-moi savoir si vous avez besoin de fichiers supplémentaires à vérifier.

Mettre à jour Après quelques recherches, j'ai découvert que le problème se trouvait dans mon fichier main-aot.ts et la façon dont ngfactory est créé. C'est mon nouveau point de départ et voici le fichier

Uncaught Error: StaticInjectorError(Platform: core)[function(){}]: 
  NullInjectorError: No provider for function(){}!
    at t.get (injector.ts:43)
    at injector.ts:346
    at Xa (injector.ts:288)
    at t.get (injector.ts:168)
    at Cp (application_ref.ts:41)
    at t.bootstrapModule (application_ref.ts:262)
    at Object.<anonymous> (main-aot.ts:14)
    at n (bootstrap:19)
    at bootstrap:83
    at bootstrap:83


0 commentaires

3 Réponses :


1
votes

Dans votre importation TranslateModule , vous passez entre parenthèses (ce qui est probablement une fonction) au lieu d'une classe pour loader.useFactory :

TranslateModule.forRoot({
  loader: {
    provide: TranslateLoader,
    // useFactory: (HttpLoaderFactory), <- Here
    useFactory: HttpLoaderFactory,
    deps: [HttpClient]
  }
}),
// ...


2 commentaires

Malheureusement, cela n'a pas résolu le problème. De plus, useFactory: (HttpLoaderFactory) a été ajouté en fonction de leur document github.com / ngx-translate / core # aot


Oops! Je n'ai jamais utilisé ngx-translate auparavant, donc j'ai pensé que c'était pour spécifier des injecteurs.



0
votes

J'ai trouvé une réponse ici si quelqu'un est confronté au même problème. Même si le problème signalé ne correspond pas à ce que j'ai rencontré, la réponse de ckapilla a résolu mon problème.

@ngtools \ webpack AOT ne fonctionne pas OU se fige à 95% d'émission


0 commentaires

0
votes

J'ai eu le même problème mais j'ai résolu en supprimant des injecteurs supplémentaires du fichier tsconfig.json

parce que j'ai été ajouté des éléments supplémentaires dans ce fichier. par exemple: "disableTypeScriptVersionCheck": true

like

{
 "compileOnSave": false,
 "compilerOptions": {
 "baseUrl": "./",
 "outDir": "./dist/out-tsc",
 "sourceMap": true,
 "declaration": false,
 "downlevelIteration": true,
 "emitDecoratorMetadata": true,
 "experimentalDecorators": true,
 "module": "esnext",
 "moduleResolution": "node",
 "importHelpers": true,
 "target": "es2015",
 "skipLibCheck": true,
 "typeRoots": [
  "node_modules/@types"
 ],
 "lib": [
   "es2018",
   "dom"
 ]
}
}

changé en

{
"angularCompilerOptions": {
"disableTypeScriptVersionCheck": true
},
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
"downlevelIteration": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"module": "esnext",
"moduleResolution": "node",
"importHelpers": true,
"target": "es2015",
"skipLibCheck": true,
"typeRoots": [
  "node_modules/@types"
],
"lib": [
  "es2018",
  "dom"
 ]
 }
}

J'espère que cela vous sera utile


0 commentaires