Не удается найти модуль './in-memory-data-service' в туре по героям для Angular2

Я пытаюсь проработать приложение Angular2 tour of heroes, и у меня обнаруживаются ошибки в Http-раздел руководства.

Сначала я получал ошибку:

Cannot find module 'angular2-in-memory-web-api'

Но исправил это с помощью информации из этого вопроса.

Однако на этом же этапе я также получаю следующую ошибку:

app/app.module.ts(10,38): error TS2307: Cannot find module './in-memory-data-service'.

Я трижды проверил и считаю, что и мой файл in-memory-data-service.ts, и файл app.module.ts точно такие же, как указано в руководстве (на данный момент).

Сейчас мой файл in-memory-data-service.ts выглядит так:

КОД:

import { InMemoryDbService } from 'angular2-in-memory-web-api';
export class InMemoryDataService implements InMemoryDbService {
createDb() {
let heroes = [
  {id: 11, name: 'Mr. Nice'},
  {id: 12, name: 'Narco'},
  {id: 13, name: 'Bombasto'},
  {id: 14, name: 'Celeritas'},
  {id: 15, name: 'Magneta'},
  {id: 16, name: 'RubberMan'},
  {id: 17, name: 'Dynama'},
  {id: 18, name: 'Dr IQ'},
  {id: 19, name: 'Magma'},
  {id: 20, name: 'Tornado'}
];
return {heroes};
  }
}

Мой файл app.module.ts выглядит так:

КОД:

import './rxjs-extensions';

import { NgModule }             from '@angular/core';
import { BrowserModule }        from '@angular/platform-browser';
import { FormsModule }          from '@angular/forms';
import { HttpModule }           from '@angular/http';

//Imports for loading & configuring the in-memory web API
import { InMemoryWebApiModule } from 'angular2-in-memory-web-api';
import { InMemoryDataService }  from './in-memory-data-service';

import { AppComponent }         from './app.component';
import { DashboardComponent }   from './dashboard.component';
import { HeroesComponent }      from './heroes.component';
import { HeroDetailComponent }  from './hero-detail.component';
import { HeroService }          from './hero.service';
import { routing }              from './app.routing';

@NgModule({
  imports:        [
                    BrowserModule,
                    FormsModule,
                    HttpModule,
                    InMemoryWebApiModule.forRoot(InMemoryDataService),
                    routing
                  ],
  declarations:   [
                    AppComponent,
                    DashboardComponent,
                    HeroDetailComponent,
                    HeroesComponent
                  ],
  providers:      [
                    HeroService
                  ],
bootstrap:        [ AppComponent ]
})

export class AppModule {
}

Я не уверен, что это связано с какой-то зависимостью в package.json или systemjs.config, которая не установлена ​​должным образом, или из-за простой ошибки, которой я помогаю.

ИЗМЕНИТЬ

Мой файл systemjs.config.js выглядит так:

КОД:

(function (global) {
System.config({
paths: {
  // paths serve as alias
  'npm:': 'node_modules/'
},
// map tells the System loader where to look for things
map: {
  // our app is within the app folder
  app: 'app',
  // angular bundles
  '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
  '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
  '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
  '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
  '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
  '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
  '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
  '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
  // other libraries
  'rxjs':                       'npm:rxjs',
  'angular2-in-memory-web-api': 'npm:angular2-in-memory-web-api',
},
// packages tells the System loader how to load when no filename and/or no extension
packages: {
  app: {
    main: './main.js',
    defaultExtension: 'js'
  },
  rxjs: {
    defaultExtension: 'js'
  },
  'angular2-in-memory-web-api': {
    main: 'index.js',
    defaultExtension: 'js'
  }
}
});
})(this);

Моя файловая структура в настоящее время выглядит так:

Структура файла:

app/app.module.ts
app/in-memory-data-service.ts

index.html
systemjs.config.js

Спасибо.


person Jonathan Bechtel    schedule 05.10.2016    source источник
comment
Я не думаю, что это будет иметь какое-либо отношение к package.json, но не могли бы вы также показать свой файл systemjs.config? Кроме того, похоже, что это как-то связано с вашей файловой структурой, поэтому вы также можете немного рассказать об этом.   -  person Logan H    schedule 05.10.2016
comment
@ Sasquatch3o3 - Спасибо за отзыв. Я пошел дальше и сделал запрошенные вами обновления. Пожалуйста, дайте мне знать, если у вас возникнут другие вопросы.   -  person Jonathan Bechtel    schedule 05.10.2016
comment
Конечно, сейчас я смотрю, смогу ли я что-нибудь найти. Спасибо за обновления!   -  person Logan H    schedule 05.10.2016
comment
У меня была такая же проблема, пока я не выяснил ее решение ... на следующем шаге Angular tour of heroes app :-)   -  person Camille    schedule 29.01.2019
comment
Сейчас 2020 год, и они исправили эту опечатку, но у меня все еще есть эта ошибка ... Мне пришлось остановить весь сервер anglar и перезапустить, и это сработало ...   -  person O-9    schedule 23.03.2020


Ответы (13)


Просто убедитесь, что все ваши базы покрыты

В вашем package.json должен совпадать с тем, который указан в этом страница.

"angular-in-memory-web-api": "~0.1.1",

Кроме того, ваш файл systemjs.config тоже выглядит неплохо!

В своем app.module.ts убедитесь, что ваш in-memory-data-service импорт соответствует вашему файлу, потому что в их примере у них есть in-memory-data.service

// Imports for loading & configuring the in-memory web api
import { InMemoryWebApiModule } from 'angular-in-memory-web-api';
import { InMemoryDataService }  from './in-memory-data-service'; // <-- Make sure this matches the file name

Итак, ваш файл должен называться in-memory-data-service.ts. Мне кажется, что есть опечатка в названии или какая-то проблема с файловой структурой.

Похоже, вы решили проблему с package.json, и ошибка, которую вы получаете, говорит о том, что он не может найти этот модуль, теперь это может быть из-за опечатки в имени файла или пути к файлу. неверно в строке импорта.

person Logan H    schedule 05.10.2016
comment
Что ж, похоже, вы решили проблему, поздравляю! Значит, это была опечатка или проблема? - person Logan H; 05.10.2016
comment
Эй, только на голову ... этот ответ сработал. Мне всегда неловко, когда ответ такой простой, но имя моего файла было неправильным :(. - person Jonathan Bechtel; 06.10.2016
comment
О, не волнуйся, мы все это делаем! Их тоже сложно выследить! Хорошая работа, рад помочь! - person Logan H; 06.10.2016
comment
Именование / словоблудие Angular в учебнике TOH создает проблемы - person Andrew Koper; 05.10.2018
comment
использование ключей данных должно иметь имя коллекции, например api/heroes, поэтому массив коллекции должен иметь heroes - person silentsudo; 11.03.2019

ng generate service InMemoryData --module=app

Создадим src/app/in-memory-data.service.ts файл. Затем добавьте код, указанный в руководстве, и он будет работать. AFAIK они даже не подразумевают этого в учебнике, так что не расстраивайтесь. На самом деле они говорят

Метод конфигурации forRoot () принимает класс InMemoryDataService, который загружает базу данных в памяти.

В примере Tour of Heroes создается такой класс src / app / in-memory-data.service.ts

Это тарабарщина и неверно.

person user875234    schedule 15.11.2017
comment
Спасибо. Я начинал думать, что пропустил целый большой раздел или совсем потерялся :) - person Scott Holtzman; 15.01.2018
comment
Спасибо! Это очень сбивает с толку - ждать, пока файл будет создан, и ничего не произойдет. Это то, чего мне не хватало! - person EranKT; 23.03.2018
comment
Большое спасибо. Они ПОЛНОСТЬЮ пропустили этот шаг. - person Jonca33; 12.04.2018
comment
Спасибо! Это должно быть отмечено как правильный ответ. Вы бы подумали, что к настоящему времени учебник был бы обновлен. - person Lean van Heerden; 13.05.2018
comment
Это определенно более правильный ответ, большое спасибо. - person Daniel Bailey; 16.08.2018

Мои проекты созданы с использованием текущих инструментов CLI, и я установил это:

npm install angular-in-memory-web-api --save

Меня устраивает.

person huseyint    schedule 28.07.2017
comment
Большое спасибо! После долгого горя это решило для меня проблему. - person tomd; 27.08.2017

Для учебника Angular5 и [email protected]:

Добавьте новый файл in-memory-data.service.ts в корневой каталог со следующим содержимым:

import { InMemoryDbService } from 'angular-in-memory-web-api';

export class InMemoryDataService  implements InMemoryDbService {
createDb() {
    let heroes = [
        { id: 1, name: 'Windstorm' },
        { id: 2, name: 'Bombasto' },
        { id: 3, name: 'Magneta' },
        { id: 4, name: 'Tornado' }
    ];
    return { heroes };
}
}
person Pavlo Lyakhov    schedule 03.02.2018

В туре по героям (пример урока по Angular) после

import { HttpClientInMemoryWebApiModule } from 'angular-in-memory-web-api';
import { InMemoryDataService } from './in-memory-data-service';

вы должны выполнить команду:

ng generate service InMemoryData
person Mohammad Aghazadeh    schedule 24.11.2018

Чтобы решить эту проблему, я сделал

ng generate service InMemoryData --module=app  

как предложено пользователем user875234

Но также многие ответы здесь были скопированы и вставлены из вопроса

import { InMemoryDataService } from './in-memory-data-service';  

Что неверно. Все должно быть так, как показано в руководстве по героям.

import { InMemoryDataService } from './in-memory-data.service';  

Обратите внимание на «dataDOTservice», а не на дефис. Нам, новичкам, это кажется ошибкой в ​​руководстве и не соответствует вопросу OP или некоторым ответам здесь. Точка правильная, дефис неправильный.

person Rin and Len    schedule 06.05.2018

Я получил эту ошибку в 2020 году. Я запускал сервер и выполнял команды ng в другом терминале.

Перезагрузка сервера сделала свое дело. (CTRL + C, нг подавать)

person Scott Jodoin    schedule 01.08.2020

Те из вас, кто просматривает старые статьи, могут попробовать это решение, повторно запустив приложение с помощью ng serve.

ng generate service InMemoryData --module = app было предыдущим решением; однако вы получите эту ошибку:

Неизвестный вариант: '--module'

По умолчанию Angular устанавливает свойство providedIn внутри декоратора @Injectable. Это позаботится о регистрации службы, и, следовательно, --module больше не является практическим решением.

Чтобы перезапустить приложение angular, вы можете запустить в интерфейсе командной строки ... taskkill / IM node.exe / F

затем ng serve

person 8ryan8    schedule 20.11.2020

Сделайте глобальную установку, используйте sudo, если у вас есть проблемы с разрешениями

npm install -g angular-in-memory-web-api
person JuricaJaman    schedule 15.10.2017

Angular 6 - Windows у меня

Failed to compile.

./src/app/in-memory-data.service
Module build failed: Error: ENOENT: no such file or directory, open 'e:\visualStudioWorkspace\angular-tour-of-heroes\src\app\in-memory-data.service'

Когда я меняю

import { InMemoryDataService }  from './in-memory-data.service';

to (обратите внимание на изменения data.service в data-service)

import { InMemoryDataService }  from './in-memory-data-service';

и переименуйте файл в in-memory-data-service.ts, он работает.

person Levijatanu    schedule 07.06.2018

чтобы решить эту проблему, попробуйте этот шаг

  1. запустите ng generate service InMemoryData --module=app со своим angular cli, затем замените код, указанный в руководстве, и сохраните его.
  2. перейдите к app.module.ts и добавьте в него код, так что код такой.

app.module.ts

import { HttpClientModule }    from '@angular/common/http';
import { HttpClientInMemoryWebApiModule } from 'angular-in-memory-web-api';
import { InMemoryDataService }  from './in-memory-data.service';

@NgModule({
declarations: [
   ...
],
imports: [
   ...
   HttpClientModule,
   // The HttpClientInMemoryWebApiModule module intercepts HTTP requests
   // and returns simulated server responses.
   // Remove it when a real server is ready to receive requests.
   HttpClientInMemoryWebApiModule.forRoot(
      InMemoryDataService, { dataEncapsulation: false }
   )
],
providers: [],
   ...
  1. Не забудьте добавить private heroesUrl = 'api/heroes'; // URL to web api в hero.service.ts

hero.service.ts

   ...
export class HeroService {

   constructor(
      private http: HttpClient,
      private messageService: MessageService,
   ) { }

   private heroesUrl = 'api/heroes';  // URL to web api

   /** GET heroes from the server */
   getHeroes (): Observable<Hero[]> {
      return this.http.get<Hero[]>(this.heroesUrl)
   }


   getHero(id: number): Observable<Hero> {
   ...

   /** Log a HeroService message with the MessageService */
   private log(message: string) {
   ...
  1. Обновите приложение, запустив ng sever, и наслаждайтесь !.
person Latief Anwar    schedule 05.10.2018

Я решил эту проблему, выполнив следующую команду:

$ yarn add angular-in-memory-web-api

Запустите это, если вы используете npm:

$ npm i angular-in-memory-web-api
person Ousama    schedule 27.08.2020

Та же проблема. Я исправляю это, останавливая ng serve, запускаю ng build и снова ng serve.

person user6266369    schedule 12.09.2020