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中的新的可观察对象).
在我看来,有两种选择:
HttpClient对象 - >无法让它工作.有谁知道如何妥善解决这个问题?
干杯,
M.
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)
| 归档时间: |
|
| 查看次数: |
320 次 |
| 最近记录: |