如何在不注入的情况下使用或替换Angular的HttpClient

问题描述 投票:0回答:1

我在 Angular 8 中构建了一个 UI,它与使用 Angular 的 HttpClient 在服务中实现的第三方 API 进行了许多复杂的交互。

现在我正在尝试将使用第三方 API 的服务代码移动到 npm 模块,以便它可以由 Node/Typescript 后端共享。除了 HttpClient 依赖之外,该后端不需要 Angular。但是,我需要保持这个共享 API 库向后兼容 Angular UI。

我有两个选择,并且正在寻求帮助和建议:

  1. 继续使用 Angular 的 HttpClient,但找到一种方法使其无需注入即可工作。我知道您可以引导它来进行注入,但是我不知道如何从外部访问这些服务类实例。此选项的好处是不会影响使用 API 服务的 Angular UI 项目。

  2. 使用另一个支持 Typescript 的 http 客户端。请注意,除了明显重写 API 服务之外,这里最大的警告是,如果它不支持 RXJS Observerables,那么它可能会影响当前 Angular UI 中使用 API 的许多当前应用程序代码。也就是说,有什么好的替代品推荐吗?

我喜欢“request”的功能,并且有types,但我找不到任何有关如何使用类型的文档。它在没有 Typescript 类中的类型的情况下运行得很好,但我担心这样做将需要对期望 Observables 的 Angular UI 用法和 HttpClient 的行为进行大部分重写,例如错误处理。

更新:我会节省大家的时间并总结我决定要做的事情...

Angular的HttpClient只能运行在浏览器中,不能运行在Node上,因为它使用了XMLHttpRequest。我正在尝试“axios”,它可以在 Node 和浏览器中运行。但是,因为我有太多的业务逻辑依赖于 Angular Http 客户端接口和行为,并且担心如果 axios 引入新问题我可能会退一步,所以我决定用一个接口来概括它,以便浏览器 UI 代码可以选择哪个客户端它想要使用,并为将来添加其他 http 客户端(例如 superagent)打开大门。

虽然 axios 返回 Promises,而 HttpClient 返回 observables(我想为 .map 之类的东西保留一个功能),但我发现你可以轻松地将 Promise 转换为 observables:

从 'rxjs' 导入 { Observable, from }; const observable = from(promise);

angular typescript httpclient angular-httpclient
1个回答
0
投票

所以我尝试在 Angular 项目之外使用 Angular

HttpClient

我收到此错误:

Uncaught Error: The injectable 'c' needs to be compiled using the JIT compiler, but '@angular/compiler' is not available.

The injectable is part of a library that has been partially compiled.
However, the Angular Linker has not processed the library such that JIT compilation is used as fallback.

Ideally, the library is processed using the Angular Linker to become fully AOT compiled.
Alternatively, the JIT compiler should be loaded by bootstrapping using '@angular/platform-browser-dynamic' or '@angular/platform-server',
or manually provide the compiler with 'import "@angular/compiler";' before bootstrapping.

使用建议:

...或手动向编译器提供

import "@angular/compiler";
...

最初对我不起作用,因为我将导入语句放在导入列表的末尾。

在任何其他导入对我有用之前先放置编译器导入语句。

© www.soinside.com 2019 - 2024. All rights reserved.