如何在 Loopback JS 中将服务注入其他服务?

How to inject services into other services in Loopback JS?

环回框架的新手。

我来自 Angular 和 Java(Spring 框架),像这样的模式很常见。

我将如何在 Loopback 中做类似的事情?

@bind({ scope: BindingScope.TRANSIENT })
export class EmailService {
  constructor(
    @service() public environmentService: EnvironmentService,
    @service() public logger: LoggingService,
    public transporter: Mail,
  ) {
    this.setupMailClient()
  }
}

这是我在尝试类似上述操作时遇到的错误:

$ yarn start
yarn run v1.22.4
$ npm run build

> service-email@1.0.0 build /Users/clementoh/projects/service-email
> lb-tsc

$ node -r source-map-support/register .
Server is running at http://[::1]:3000/development/v1/emails
Try http://[::1]:3000/development/v1/emails/ping
Unhandled error in POST /verifications/email: 500 ResolutionError: The argument 'LoggingService.constructor[1]' is not decorated for dependency injection but no value was supplied by the caller. Did you forget to apply @inject() to the argument? (context: RequestContext-x2a2BH0zTmy5OlakULzpvw-3, resolutionPath: controllers.RemoteConfigController --> @RemoteConfigController.constructor[0] --> services.EmailService --> @EmailService.constructor[1] --> services.LoggingService)

注入服务的语法如下:

constructor(
    @service(MyService) public myService: MyService
) {}

尝试一下,如果它再次不起作用,您需要在 Application Context 上绑定您的服务,例如在 application.ts 内部(或在您的 Application 构造函数上):

import {MyService} from './services';

constructor(options = ApplicationConfig = {}) {
    super(options);

    // Setup
    this.bind('services.my-service').toClass(MyService);
}

现在您可以通过以前或从这里注入您的服务:

@inject('services.my-service) public myService: MyService

感谢@lorenzoli 为我指明了正确的方向。

我收到错误的原因是因为我使用 TypeScript 功能在构造函数中定义时自动创建 class 级属性。

@bind({scope: BindingScope.TRANSIENT})
export class EmailService {
  constructor(public transporter: Mail) {
    this.setupMailClient()
  }
}

当我从构造函数中删除 属性 时,一切都按预期工作。

我想对于 Loopback,我们不应该使用 Angular 项目中常见的 TypeScript 自动 属性 创建语法。

@bind({scope: BindingScope.TRANSIENT})
export class EmailService {
  public transporter: Mail

  constructor() {
    this.setupMailClient()
  }
}