如何在 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()
}
}
环回框架的新手。
我来自 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()
}
}