禁用angular2 in-memory-web-api进行生产

时间:2016-10-24 08:48:34

标签: angular

我使用angular2 in-memory-web-api进行开发。对于生产环境,我想禁用in-memory-web-api和我要使用的真实API。有没有办法禁用生产的InMemoryWebApiModule

3 个答案:

答案 0 :(得分:5)

假设您有某种“切换”,无论是节点ENV的Angular CLI environment,您都可以切换应该使用哪个XHRBackendin-memory-web-api使用自己的后端InMemoryBackendService。所以你可以做类似

的事情
import { NgModule, Injector } from '@angular/core';
import { HttpModule, XHRBackend, BrowserXhr,
         ResponseOptions,  XSRFStrategy } from '@angular/http';

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

let environment = {
  production: true
};

export class MockData implements InMemoryDbService {
  createDb() {
    let cats = [
      { id: 1, name: 'Fluffy' }
    ];
    return { cats };
  }
}

@NgModule({
  imports: [ HttpModule ],
  providers: [
    {
      provide: XHRBackend,
      useFactory: (injector: Injector, browser: BrowserXhr,
                   xsrf: XSRFStrategy, options: ResponseOptions): any => {
        if (environment.production) {
          return new XHRBackend(browser, options, xsrf);
        } else {
          return new InMemoryBackendService(injector, new MockData(), {
            // the configuration object
          });
        }
      },
      deps: [ Injector, BrowserXhr, XSRFStrategy, ResponseOptions ]
    }
  ]
})
export class AppHttpModule {
}

在这里,我们导入HttpModule,然后动态创建XHRBackend依赖项。在开发环境中,它将使用后端服务,这实际上是在我们使用InMemoryWebApiModule时发生的情况。因此,我们不是使用该模块,而是自己配置后端服务。在生产环境中,它只使用通常使用的XHRBackend

另请注意environment。这只是一个例子。这可能不会被您使用。理想情况下,环境应该是在命令行上控制的。使用Angular CLI,它实际上提供了environment中的environment/environment变量。环境会在生产版本中通过CLI自动切换。

如果您没有使用CLI,那么您可能会使用节点ENV或您计划切换生产的任何方式。关键是,上面使用的environment只是一个例子。理想情况下,这不是您想要手动更改的内容。您的项目应该有一些方法来确定生产构建,并且应该能够在您的代码中访问它。

同样使用上述AppHttpModule,您不再需要将HttpModule导入AppModule,只需导入AppHttpModule

答案 1 :(得分:3)

这种简单的方法对我有用:

const ENV = 'prod'; // your global ENV variable;
-----

@NgModule({
  imports: [
    ...
    HttpModule,
    ENV !== 'prod' ? InMemoryWebApiModule.forRoot(DataMockService) : [],
  ],
  ...
})
export class AppModule {}

答案 2 :(得分:1)

同样的方式:

import { environment } from './app.constants';
let myTestApiModule = [];
if (!environment.production) {
   myTestApiModule.push(InMemoryWebApiModule.forRoot(InMemDataService, 
   { delay: 500 })
   );
}

imports: [
   CommonModule,
   SharedModule,
   ...myTestApiModule,
],