Issue
I have an Angular 8 app and working nice in dev mode, but if i do 'ng serve --prod' it's compiling without error but when launching the app i got this error in console :
ERROR Error: "Uncaught (in promise): TypeError: token is undefined getOrCreateInjectable/bloomHash<@http://localhost:4200/main.cf6fe5006f05f980ad3b.js:1:249524 getOrCreateInjectable@http://localhost:4200/main.cf6fe5006f05f980ad3b.js:1:249614 get@http://localhost:4200/main.cf6fe5006f05f980ad3b.js:1:254632 PlayerComponent@http://localhost:4200/main.cf6fe5006f05f980ad3b.js:1:726594 factory@http://localhost:4200/main.cf6fe5006f05f980ad3b.js:1:728189 getNodeInjectable@http://localhost:4200/main.cf6fe5006f05f980ad3b.js:1:253710 ...
Do you have an idea on how determine what's going wrong ? Reading the error i have my PlayerComponent called but there is nothing special in
import { Game, IsoScene } from 'src/app/tars/classes';
import { NavigatorService } from 'src/app/tars/services';
import { DataProvider, ElementProvider } from 'src/app/tars/providers';
import { ElementProvider as POCElementProvider } from 'src/app/services/element.provider';
import { IsoPlayerScene } from 'src/app/classes/scenes/iso';
import { InteractionsMenu } from 'src/app/interfaces';
import { DataProviderFactory } from 'src/app/services/dataProviders/factory.service';
import { OnReadyRenderer2DEvent, Interaction } from 'src/app/tars/interfaces';
import { TitleScene } from 'src/app/classes/scenes/title';
@Component({
selector: 'tars-player',
templateUrl: './player.component.html',
styleUrls: ['./player.component.scss']
})
export class PlayerComponent {
private rendererW: number;
private rendererH: number;
public get rendererHeight(): number {
return this.rendererH;
}
public get rendererWidth(): number {
return this.rendererW;
}
private game: Game;
private navigatorService: NavigatorService;
private dataProvider: DataProvider;
private elementProvider: ElementProvider;
private isoPlayer: IsoPlayerScene;
public menuStructure: InteractionsMenu;
constructor(
private injector: Injector,
private ngZone: NgZone
) {
this.navigatorService = injector.get(NavigatorService);
this.dataProvider = injector.get(DataProvider);
this.dataProvider.set(injector.get(DataProviderFactory.factory()));
this.elementProvider = injector.get(ElementProvider);
this.elementProvider.set(injector.get(POCElementProvider));
this.resetInteractionsMenu();
}
rendererOnReady(event: OnReadyRenderer2DEvent) {
// Create the game object
this.game = new Game(this.injector, event.context);
this.game.onLoaded.subscribe((res: boolean) => {
// Ask current client size
this.refreshClientSize();
// Run the game (when ready inside)
this.ngZone.runOutsideAngular(() => this.game.run());
});
// Specific link
this.isoPlayer = new IsoPlayerScene(this.injector, {name: 'world'}, event.context);
this.isoPlayer.onInteractionsMenu.subscribe((structure: InteractionsMenu) => {
this.ngZone.run(() => {
if (structure) {
this.menuStructure = structure;
} else {
this.resetInteractionsMenu();
}
});
});
this.game.load([
this.isoPlayer,
new TitleScene(this.injector, {name: 'title'}, event.context),
new IsoScene(this.injector, {name: 'loader'}, event.context),
], 'title', 'loader');
}
// Listen the window resize event
@HostListener('window:resize', ['$event'])
onResize(event: any) {
this.refreshClientSize();
this.resetInteractionsMenu();
}
// Get the window/body size to set the graph size
public refreshClientSize() {
const browserSize = this.navigatorService.getClientSizeFromBrowser();
this.rendererW = browserSize.width;
this.rendererH = browserSize.height;
this.navigatorService.setClientSize(browserSize.width, browserSize.height);
}
// Keyboard management
@HostListener('window:keydown', ['$event'])
onKeyPress(event: any) {
this.navigatorService.keyDown(event);
}
private resetInteractionsMenu() {
this.menuStructure = {
interactions: [],
screenCoord: { screenX: 0, screenY: 0 }
};
}
// Do interaction when menu selection is done and reset menu
menuOnSelect(interaction: Interaction) {
this.isoPlayer.doInteraction(interaction);
this.resetInteractionsMenu();
}
}
Like i said, it's working in dev and i don't understand why --prod give this result.
EDIT:
It seems to be the line this.dataProvider.set(injector.get(DataProviderFactory.factory()));
about the factory with the code below that break on --prod
@Injectable()
export class DataProviderFactory {
public static factory() {
if (environment.dataOrigin === DataOrigin.Fake) {
return Faker;
} else {
// ...
}
}
}
If i replace DataProviderFactory.factory()
by Faker directly it's working.
I read about some problem with Ivy and creatInjector but it seems not working.
Any idea ?
Solution
In the context of --prod, DataProviderFactory return a null value that the injector can't handle for tokenisation. So it fail, my bad. But the diplayed exception is not at all clear and helpfull. Hope this can help others.
Answered By - Killan
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.