可以从 Angular2 中的“InMemoryWebApiModule”转换吗?

Possible to transition from `InMemoryWebApiModule` in Angular2?

我已经实现了一个基于"Tour of Heroes" tutorial 的项目。我已经到了想要开始使用真正的 REST 后端的地步,但理想情况下,我只想逐个操作地执行此操作。

我更新了 post 调用以将 URL 用于我的 REST 服务,如下所示:

create(hero: Hero): Promise<Hero> {
    return this.http
        .post("http://127.0.0.1:3001/api/heroes", JSON.stringify(hero), {headers: this.headers})
        .toPromise()
        .then(res => return res.json().data)
        .catch(this.handleError);
}

问题是,这仍然只是命中 InMemoryWebApiModule 提供的 InMemoryDbService。事实上,我提供的 URL 是什么并不重要——只要它以 /heroes 结尾,它就可以工作。我可以输入任何端口号、任何路径和任何 IP(只要它是以 /heroes 结尾的可解析 URL)。

我预计 HttpModule 会正常工作,而 InMemoryWebApiModule 只会在 URL 解析为应用程序的 URL 时才会被命中。显然情况并非如此,并且以某种方式在您的模块导入中使用 InMemoryWebApiModule.forRoot(InMemoryDataService) 会改变 Http 的工作方式(据我所知)。

所以我的问题是 - 在过渡到真实服务时是否可以继续使用 InMemoryWebApiModule 来托管模拟服务?您将如何修改 "Tour of Heroes" 教程以针对单个操作执行此操作?

您可以将选项配置对象传递给 InMemoryWebApiModule.forRoot。其中一种配置是passThruUnknownUrl。将其设置为true,如果找不到模拟数据中的集合

,它将使用正常的XHRBackend
imports: [
  InMemoryWebApiModule.forRoot(MockData, {
    passThruUnknownUrl: true
  })
]

因此在开发过程中,随着在后端创建新集合,您可以开始在前端删除它们

createDb() {
  let cats = [];
  let dogs = [];
  return {
    cats,
    // dogs
  }
}

最初,内存中会处理 URL /api/cats/api/dogs。但是可以说 dogs 集合现在是在后端创建的。您可以从上面返回的集合中删除 dogs,现在内存中会将这些调用转发给正常的 XHRBackend,以便进行 XHR 调用。