I'm doing a POC to prove I have communication between the back end and front end in Angular Universal. I've got a JSON file in the back end called heroes.json that I want to retrieve from the front end service ModelService in model.service.ts.
I have this folder structure:
Within model.service.ts (front end) I want to create an http request to get some data in a method called getStuff().
I have this in model.service.ts:
// domain/feature service
@Injectable()
export class ModelService {
private heroesUrl = "http://localhost:4000/src/backend/heroes.json"; // URL to JSON file
// This is only one example of one Model depending on your domain
constructor(public api: ApiService, public cacheService: CacheService, private http: Http) {
}
public getStuff(): Observable<any[]> {
return this.http.get(this.heroesUrl)
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
let body = res.json();
return body.data || { };
}
private handleError (error: Response | any) {
// In a real world app, we might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || "";
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ""} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
// domain/feature service
@Injectable()
export class ModelService {
private heroesUrl = "http://localhost:4000/src/backend/heroes.json"; // URL to JSON file
// This is only one example of one Model depending on your domain
constructor(public api: ApiService, public cacheService: CacheService, private http: Http) {
}
public getStuff(): Observable<any[]> {
return this.http.get(this.heroesUrl)
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
let body = res.json();
return body.data || { };
}
private handleError (error: Response | any) {
// In a real world app, we might use a remote logging infrastructure
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || "";
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ""} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
From a front end component I am calling the ModelService.getHeroes:
export class HomeComponent {
public data: any = {};
constructor(public modelService: ModelService) {
// we need the data synchronously for the client to set the server response
// we create another method so we have more control for testing
this.universalInit();
}
public universalInit() {
this.modelService.getStuff().subscribe((data) => {
this.data = data;
});
}
I'm getting this error:
GET /src/backend/heroes.json 404 3.698 ms - 46
404 - {"status":404,"message":"No Content"}
EXCEPTION: 404 - {"status":404,"message":"No Content"}
/private/var/root/vepo/node_modules/rxjs/Subscriber.js:227
throw err;
^
404 - {"status":404,"message":"No Content"}
[nodemon] app crashed - waiting for file changes before starting...
So my url private heroesUrl = "http://localhost:4000/src/backend/heroes.json"; // URL to JSON file in the service is wrong. Given that folder structure, what would the url be? Because the actual running project, the output, is in dist:
So I'm not sure what to put in ModelService.heroesUrl. What string value should ModelService.heroesUrl have?


you have to put your json file into you dist folder client and you have to change your url to
http://localhost:4000/dist/heroes.json<-- destination where you are putting your json file in dist directory