网站搜索

在 Angular 5 中无法获取本地 json 文件 - 持续出现 404 错误


我已经阅读了我能找到的关于这个的每一篇文章或帖子。我真搞不清楚自己在这个简单任务上到底哪里做错了。(特别是按照这个例子。)我一定是做了某些明显愚蠢的事情,但我已经盯着它看了太久,以至于看不出来。

我在 assets/mockData 中有一个名为 isRecognized.json 的 JSON 文件。我已经将 mockData 目录添加到我的 webpack 配置文件中,这样它就包含在 /dist 目录中。如果我访问 http://localhost:4200/assets/mockData/isRecognized.json,我可以看到该文件,所以我知道它是可用的。

然而,当我尝试使用 HTTP 客户端检索该文件时,无论我尝试什么,它都会抛出 404 错误。

编辑:我使用的是 Webpack,而不是 Angular CLI。

app.component.ts

import { MyService } from './services/my.service';
import { Component, OnInit, Renderer2 } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

/*
* Main app component that houses all views.
*/
@Component({
    selector: 'app-comp',
    templateUrl: './app.component.html'
})

export class AppComponent implements OnInit {

    constructor(
        private route: ActivatedRoute, private service: MyService
    ) {}

    ngOnInit() {
      this.service.isRecognized();
    }

}

my.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

@Injectable()
export class MyService {

  constructor(private http: HttpClient) { }

  isRecognized() {
    this.getJSON('isRecognized').subscribe(data => {
      console.log(data);
    });
  }

  getJSON(fileName): Observable<any> {
    return this.http.get('http://localhost:4200/assets/mockData/' + fileName + '.json');
  }
}

我在浏览器控制台收到的错误是:

AppComponent_Host.ngfactory.js? [sm]:1 ERROR Error: [object Object]
    at viewWrappedDebugError (core.js:9795)
    at callWithDebugContext (core.js:15101)
    at Object.debugCheckAndUpdateView [as checkAndUpdateView] (core.js:14628)
    at ViewRef_.webpackJsonp../node_modules/@angular/core/esm5/core.js.ViewRef_.detectChanges (core.js:11605)
    at core.js:5913
    at Array.forEach (<anonymous>)
    at ApplicationRef.webpackJsonp../node_modules/@angular/core/esm5/core.js.ApplicationRef.tick (core.js:5913)
    at core.js:5746
    at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (zone.js:391)
    at Object.onInvoke (core.js:4756)

如果我调试这个错误,我可以看到错误的主体是:

答案#1

我在我的应用中成功使用这个,只需使用这样的 URL:

private productUrl = 'api/products/products.json';

注意,它的路径中没有 localhost 部分。

所以试试更像这样的方式:

'assets/mockData/' + fileName + '.json'

还要确保你的 angular.json 在 assets 下列出了该路径:

        "assets": [
          "src/favicon.ico",
          "src/assets",
          "src/api"
        ],

注意:我也没有对我的 webpack 配置做过任何修改。(但我正在使用 CLI。)

如果你想看一些访问 json 文件的工作代码,我这里有一个例子:

https://stackblitz.com/edit/github-gettingstarted-deborahk

答案#2

我建议在组件中进行订阅,并从服务中返回一个可观察对象(Observable):

服务:

@Injectable()
export class MyService {

  constructor(private http: HttpClient) { }

  isRecognized(fileName): Observable<any> {
    return this.http.get('http://localhost:4200/assets/mockData/' + fileName + '.json');
  }

}

组件:

export class AppComponent implements OnInit {

    constructor(
        private route: ActivatedRoute, private service: MyService
    ) {}

    ngOnInit() {
      this.service.isRecognized(fileName)
         .subscribe(data => {
              console.log(data);
         });
    }
}