如何在节点脚本中重用Angular 6 API服务?

DuX*_*ati 11 node.js typescript angular

我想在节点脚本中重用一些Angular 6 API服务,并且面临一些问题,正确地初始化所有内容.

使用Swagger Codegen(-l typescript-angular)生成API服务,例如:

@Injectable()
export class UserService {

    constructor(protected httpClient: HttpClient, @Optional()@Inject(BASE_PATH) basePath: string, @Optional() configuration: Configuration) { 
      ... 
    }

}
Run Code Online (Sandbox Code Playgroud)

这些服务在我的Angular 6应用程序中运行得很好,我现在想在节点中使用它们进行一些脚本编写.我知道Swagger Codegen也能够生成纯粹的Typescript客户端,但仍然希望重用现有的Angular服务来保持代码库更加一致.

我当时面临的挑战是如何在没有依赖注入的情况下调用此构造函数.

HttpClient没有依赖注入的情况下获得有效对象似乎非常困难.在AngularJS中,我曾经依赖于Axios,但是这个库并没有提供与HttpClient它看起来相同的接口(仍然是承诺而不是Angular 6中的新的可观察对象).

在我看来,有两种选择:

  1. 不知何故得到一个HttpClient对象 - >无法让它工作.
  2. 注入另一个暴露相同接口的HTTP客户端对象 - >似乎找不到一个.

有谁知道如何妥善解决这个问题?

干杯,

M.

Est*_*ask 6

HttpClient不应该手动实例化,这不是简单的过程,因为它有很多依赖.Angular进程器完成依赖注入的所有工作,应该用于获取实例.

本回答所示,可以HttpClient通过设置模块并引导它来获取Angular provider()的实例.

应该使用非常类似的方法UserService.这是简化但可行的示例:

import 'zone.js/dist/zone-node';
import 'reflect-metadata';

import {Injector, Injectable, NgModule } from '@angular/core'
import {HttpClient, HttpClientModule} from '@angular/common/http'
import {ServerModule, platformDynamicServer} from '@angular/platform-server';

@Injectable()
export class UserService {
  constructor(protected httpClient: HttpClient) { 
    httpClient.get('https://google.com/').subscribe(console.log, console.error);
  }
}

@NgModule({
  imports: [ServerModule, HttpClientModule],
  providers: [UserService]
})
export class AppModule {
  ngDoBootstrap() {}
}

(async () => {
    const platform = platformDynamicServer();
    const appModule = await platform.bootstrapModule(AppModule);
    const userService = appModule.injector.get(UserService);
})()
.catch(console.error);
Run Code Online (Sandbox Code Playgroud)

它需要兼容的TypeScript配置,例如:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "strict": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}
Run Code Online (Sandbox Code Playgroud)