Загрузка файла json из angular2 для определенного объекта вызвала ошибку 404

Я пытаюсь создать приложение с использованием Angular2, но у меня возникает проблема, когда я делаю запрос на получение по идентификатору для определенного продукта. Некоторые из файлов, связанных с моей проблемой, приведены ниже:

список продуктов.component.html

  <tbody>
                <tr *ngFor='let product of products | productFilter:listFilter'>
                    <td>
                        <img *ngIf='showImage && product.imageUrl'
                             [src]='product.imageUrl'
                             [title]='product.productName | uppercase'
                             [style.width.px]='imageWidth' 
                             [style.margin.px]='imageMargin'>
                    </td>
                    <td><a [routerLink]="['/product', product.id]">
                             // when I click over this in web browser the URL is "http://localhost:4200/product/1" which is exactly what I want 
                            //but I got the following error in console: GET http://localhost:4200/assets/product.json/1 404 (Not Found)
                        {{product.productName}}
                        </a>
                    </td>

Мой файл json выглядит следующим образом:

[ 
   {
    "id": 1,
    "productName": "Leaf Rake",
    "productCode": "GDN-0011",
    "releaseDate": "March 19, 2016",
    "description": "Leaf rake with 48-inch wooden handle.",
    "price": 19.95,
    "starRating": 3.2,
    "imageUrl": "http://openclipart.org/image/300px/svg_to_png/26215/Anonymous_Leaf_Rake.png"
},
{
    "id": 2,
    "productName": "Garden Cart",
    "productCode": "GDN-0023",
    "releaseDate": "March 18, 2016",
    "description": "15 gallon capacity rolling garden cart",
    "price": 32.99,
    "starRating": 4.2,
    "imageUrl": "http://openclipart.org/image/300px/svg_to_png/58471/garden_cart.png"
    },
    // other objects
 ]

Мой служебный файл показан ниже

  import { IProduct } from './product';

 @Injectable()
 export class ProductService {
private baseUrl = './assets/product.json';

constructor(private http: Http) { }

getProducts(): Observable<IProduct[]> {
    return this.http.get(this.baseUrl)
        .map((response: Response) => <IProduct[]> response.json())
        .do(data => console.log('getProducts: ' + JSON.stringify(data)))
        .catch(this.handleError);
}


getProduct(id: number): Observable<IProduct> {
    if (id === 0) {
    //return Observable.of(this.initializeProduct());
 return Observable.create((observer: any) => {
        observer.next(this.initializeProduct());
         observer.complete();
     });
    };
    const url = `${this.baseUrl}/${id}`;
    return this.http.get(url)
        .map(this.extractData)
        .do(data => console.log('getProduct: ' + JSON.stringify(data)))
        .catch(this.handleError);
}

Когда я выполняю вызов getProducts(), у меня нет ошибки, и все продукты в формате Json загружаются правильно, но когда я делаю getProduct(id), я получаю указанную выше ошибку. .

Под вызовом getProducts() я подразумеваю строки кода ниже, которые находятся в моем product-list.component.ts.

 ngOnInit() : void {
    this._productService.getProducts()
    .subscribe(products => this.products=products,
                error => this.errorMessage = <any> error);
  console.log(this.products)
 } // this works perfectly

Под getProduct(id) я подразумеваю строки кода ниже

    ngOnInit(): void {
      this.sub = this.route.params.subscribe(
         params => {
            let id = +params['id'];
             this.getProduct(id);
     }); // this one is now working properly since I got a 404 error

Я не уверен, связана ли моя проблема с правильной загрузкой файла json, но я думаю, что, поскольку я могу получить все продукты, что-то не так с маршрутизацией или я что-то упускаю.

Я сталкиваюсь с этой проблемой в течение двух дней, и я не смог найти подходящее решение в Google, поэтому я решил обратиться за помощью. Спасибо заранее.


person Dea    schedule 23.03.2017    source источник
comment
Вы проверили правильность URL-адреса для вашего запроса на получение?   -  person AJT82    schedule 23.03.2017
comment
Я имею в виду, что ошибка 404 означает, что URL-адрес, который вы пытаетесь достичь, не существует, вам нужно проверить свой URL-адрес :)   -  person AJT82    schedule 23.03.2017
comment
@ AJT_82 Под URL-адресом вы имеете в виду URL-адрес, по которому находится файл json, или URL-адрес браузера?   -  person Dea    schedule 23.03.2017
comment
Я имею в виду ваш URL-адрес запроса, да ... и теперь я вижу из вашего вопроса ... в нем четко указано, что URL-адрес, который вы пытаетесь достичь, не найден, поэтому следующий URL-адрес неверен: GET http://localhost:4200/assets/product.json/1 404 (Not Found) как говорит ошибка :)   -  person AJT82    schedule 23.03.2017
comment
Вы используете статический файл json? Вы не можете делать почтовые запросы к этому (или получать запросы с параметрами URL). Если у вас нет настоящего бэкенда, я бы предложил этот InMemoryWebApi. вот как это настроить: angular.io/docs/ts/latest /tutorial/toh-pt6.html# Вы можете делать к нему POST-запросы.   -  person AJT82    schedule 23.03.2017
comment
@ AJT_82 Да, ты прав. Actullay У меня есть файл typerscripte, использующий InMemoryWebApi с методом createDb(), но когда я использую этот InMemoryWebApi, я не могу получить все продукты, и я console.log ошибка, и ошибка: Коллекция «продукт» не найдена   -  person Dea    schedule 23.03.2017
comment
Это звучит как несоответствие. Collection ошибки возникают, когда вы смешиваете настоящий http и веб-API в памяти.   -  person AJT82    schedule 23.03.2017
comment
Вам нужно проверить свой код и перейти по ссылке, которую я предоставил, если вы хотите использовать веб-API в памяти, где-то в вашей настройке должна быть ошибка, если вы получаете эту ошибку. Вот вопрос и ответ относительно ошибки (stackoverflow.com/questions/42386685/), этот ответ не решит вашу проблему, но, возможно, поможет вам понять ошибку: ) Перейдите по ссылке, которую я дал здесь в комментариях про inmemoryap, и по той, которую я привел в ссылках, и получите правильную настройку для своего http :)   -  person AJT82    schedule 23.03.2017
comment
@ AJT_82 AJT_82 Можете ли вы подсказать, как использовать веб-API в памяти в моем сервисе, чтобы вызывать формат json?   -  person Dea    schedule 23.03.2017
comment
Я не могу помочь вам больше, чем предоставить ту ссылку, которую я дал: angular.io/docs/ts/latest/tutorial/toh-pt6.html# После этого должен заставить его работать. Если вы не можете решить эту проблему, я предлагаю вам открыть новый вопрос по этому поводу, чтобы получить помощь в его настройке. Я не могу помочь более близко, так как я знаю это только в теории, не использовал inmemoryapi сам. Но, как сказано, если вы не можете решить, задайте новый вопрос об этом, я уверен, что кто-то может вам в этом помочь! :)   -  person AJT82    schedule 23.03.2017


Ответы (1)


Я также столкнулся с этой ошибкой и, наконец, нашел решение. Несмотря на то, что решение ясно, оно отлично работает, внося изменения, как показано ниже.

private baseUrl ='assets/product.json';

не должен давать как

Файл './assets/product.json' или 'src/assets/product.json' product.json должен быть помещен в папку с ресурсами

person Priya    schedule 18.08.2017