15 votes

Comment résoudre l'ERROR NetworkError à XMLHttpRequest.send (...dist) \fxcore\server\main.js :200768:19)

Je suis nouveau dans Angular. Je viens de terminer le développement de mon application web angulaire. Lorsque j'utilise ng serve pour servir mon application en production, tout fonctionne bien. J'ai ajouté angular universal. Maintenant, lorsque j'exécute l'une des commandes npm run dev:ssr ou npm run build:ssr && npm run serve:ssr, mon application refuse de s'ouvrir et affiche une réponse NetworkError dans la console. J'ai remarqué que cette erreur se produit pour le nombre de requêtes http envoyées via la classe 'constructors(){..}'. J'ai parcouru plusieurs solutions, mais je n'ai pas trouvé d'indice sur ce que je ne fais pas correctement. Mon backend est développé avec nodejs et express. J'apprécierai toute aide que je pourrai obtenir. Voici un exemple complet de la réponse d'erreur que j'obtiens toujours dans la console.

ERROR NetworkError
    at XMLHttpRequest.send (C:\Users\MRBEN\Desktop\Angular\fxcore\dist\fxcore\server\main.js:200768:19)
    at Observable._subscribe (C:\Users\MRBEN\Desktop\Angular\fxcore\dist\fxcore\server\main.js:19025:17)
    at Observable._trySubscribe (C:\Users\MRBEN\Desktop\Angular\fxcore\dist\fxcore\server\main.js:186304:25)
    at Observable.subscribe (C:\Users\MRBEN\Desktop\Angular\fxcore\dist\fxcore\server\main.js:186290:22)
    at scheduleTask (C:\Users\MRBEN\Desktop\Angular\fxcore\dist\fxcore\server\main.js:105897:32)
    at Observable._subscribe (C:\Users\MRBEN\Desktop\Angular\fxcore\dist\fxcore\server\main.js:105959:13)
    at Observable._trySubscribe (C:\Users\MRBEN\Desktop\Angular\fxcore\dist\fxcore\server\main.js:186304:25)
    at Observable.subscribe (C:\Users\MRBEN\Desktop\Angular\fxcore\dist\fxcore\server\main.js:186290:22)
    at subscribeToResult (C:\Users\MRBEN\Desktop\Angular\fxcore\dist\fxcore\server\main.js:196385:23)
    at MergeMapSubscriber._innerSub (C:\Users\MRBEN\Desktop\Angular\fxcore\dist\fxcore\server\main.js:191575:116)```

5voto

Ian Poston Framer Points 198

J'avais toujours ce message ERROR NetworkError mais j'ai trouvé un autre moyen de faire disparaître cette erreur. Je pense que cette réponse est pertinente puisque je recevais la même erreur que celle affichée ci-dessus. Si cela peut aider quelqu'un qui a la même erreur de serveur, c'est génial.

Si la demande d'api est faite au serveur OnInit lors de la vérification du rechargement isPlatformBrowser d'abord lorsque vous utilisez ng-universal exemple.

import { Component, OnInit, PLATFORM_ID, Inject } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';
import { HttpClient, HttpHeaders } from '@angular/common/http';

public testBrowser: boolean;
export class HomeComponent implements OnInit {

  public testBrowser  : boolean;
  public data         : any;

  constructor(private http: HttpClient, @Inject(PLATFORM_ID) platformId: string) {
    this.testBrowser = isPlatformBrowser(platformId);
  }

  ngOnInit() {
    if (this.testBrowser) {
      //avoid server NETWORK error
      this.data = this.http.get('/api');
    }
  }
}

J'ai obtenu la même erreur en essayant de faire des appels au serveur depuis le client avant de vérifier isPlatformBrowser === true premièrement OnInit et cela a résolu mon problème. J'espère que cela pourra résoudre ce problème.

Pour référence, cette réponse m'a aidé à résoudre ce problème de longue date. https://stackoverflow.com/a/46893433/4684183

3voto

Ian Poston Framer Points 198

Je reçois la même erreur. Essayez de supprimer TransferHttpCacheModule de votre app.module et créez votre propre fichier personnalisé d'intercepteur de transfert http.

J'ai créé un fichier appelé transfer-state.interceptor.ts et l'a ensuite ajouté à app.module providers:[] pour gérer cela. Les exemples ci-dessous montrent comment je l'ai mis en place. Je ne suis pas sûr que cela fonctionnera pour vous, mais cette erreur a disparu pour moi.

//app.module.ts

import { BrowserModule, BrowserTransferStateModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule, HTTP_INTERCEPTORS } from "@angular/common/http";
//import {TransferHttpCacheModule } from '@nguniversal/common';

import { AppRoutingModule } from './app-routing/app-routing.module';
import { AppComponent } from './app.component';
import { HomeComponent } from './modules/home/home.component';
import { SliderComponent } from './components/slider/slider.component';
import { WindowRefService } from './services/window-ref.service';
//import { TransferHttpInterceptorService } from './services/transfer-http-interceptor.service';
import { TransferStateInterceptor } from './interceptors/transfer-state.interceptor';
import { ServiceWorkerModule } from '@angular/service-worker';
import { environment } from '../environments/environment';

@NgModule({
  declarations: [
    AppComponent,
    HomeComponent,
    SliderComponent
  ],
  imports: [
    BrowserModule.withServerTransition({ appId: 'serverApp' }),
    BrowserTransferStateModule,
    AppRoutingModule,
    HttpClientModule,
    ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production })
  ],
  providers: [
    WindowRefService,
    {
      provide: HTTP_INTERCEPTORS,
      useClass: TransferStateInterceptor,
      multi: true
    }
],
  bootstrap: [AppComponent]
})
export class AppModule { }

Il s'agit d'une version d'un fichier d'état de transfert personnalisé, mais il existe plusieurs façons de procéder si celle-ci ne fonctionne pas.

//transfer-state.interceptor.ts

import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';
import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
import { Observable, of } from 'rxjs';
import { StateKey, TransferState, makeStateKey } from '@angular/platform-browser';
import { isPlatformBrowser, isPlatformServer } from '@angular/common';
import { tap } from 'rxjs/operators';

@Injectable()
export class TransferStateInterceptor implements HttpInterceptor {

  constructor(
    private transferState: TransferState,
    @Inject(PLATFORM_ID) private platformId: any,
  ) {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    // For this demo application, we will only worry about State Transfer for get requests.
    if (request.method !== 'GET') {
      return next.handle(request);
    }

    // Use the request url as the key.
    const stateKey: StateKey<string> = makeStateKey<string>(request.url);

    // For any http requests made on the server, store the response in State Transfer.
    if (isPlatformServer(this.platformId)) {
      return next.handle(request).pipe(
        tap((event: HttpResponse<any>) => {
          this.transferState.set(stateKey, event.body);
        })
      );
    }

    // For any http requests made in the browser, first check State Transfer for a 
    // response corresponding to the request url.
    if (isPlatformBrowser(this.platformId)) {
      const transferStateResponse = this.transferState.get<any>(stateKey, null);
      if (transferStateResponse) {
        const response = new HttpResponse({ body: transferStateResponse, status: 200 });

        // Remove the response from state transfer, so any future requests to 
        // the same url go to the network (this avoids us creating an 
        // implicit/unintentional caching mechanism).
        this.transferState.remove(stateKey);
        return of(response);
      } else {
        return next.handle(request);
      }
    }
  }
}

Si vous souhaitez ajouter un cache personnalisé, vous pouvez le faire en installant memory-cache mais je ne l'ai pas encore essayé. Pour plus de références, ces articles m'ont beaucoup aidé et peut-être qu'ils peuvent vous aider aussi.

https://itnext.io/angular-universal-caching-transferstate-96eaaa386198

https://willtaylor.blog/angular-universal-for-angular-developers/

https://bcodes.io/blog/post/angular-universal-relative-to-absolute-http-interceptor

Si vous ne l'avez pas fait, vous devrez peut-être ajouter ServerTransferStateModule à votre fichier app.server.module.

//app.server.module

import { NgModule } from '@angular/core';
import {
  ServerModule,
  ServerTransferStateModule
} from "@angular/platform-server";

import { AppModule } from './app.module';
import { AppComponent } from './app.component';

@NgModule({
  imports: [
    AppModule,
    ServerModule,
    ServerTransferStateModule
  ],
  bootstrap: [AppComponent],
})
export class AppServerModule {}

Bonne chance !

0voto

Yuriy Gyerts Points 141

J'ai la même erreur, elle a été résolue en ajoutant localhost à l'URL.

avant :

this.http.get<IData[]>('/api/data')

après

this.http.get<IData[]>('http://localhost:4200/api/data')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X