Добавление службы в приложение loopback4 и методы класса службы, не работающие на конечных точках контроллера - PullRequest
0 голосов
/ 18 июня 2020

Я реализую службу SMS в приложении loopback4. У меня есть класс службы, у которого есть один метод, но когда я пытаюсь вызвать его в конечной точке контроллера, после внедрения зависимости и привязки службы к приложению я получаю сообщение об ошибке, в котором говорится, что это не функция, хотя машинописный текст запрашивает у меня 2 параметра, которые требуются, как я могу это исправить?

Это класс обслуживания

@bind({scope: BindingScope.TRANSIENT})
export class NexmoService {
  constructor() {}

  sendSMS(to: any, message: string){
    nexmo.message.sendSms(from, to , message, {
      type: 'unicode'
    }, (err: any, responseData: any)=> {
      if (err){
        console.log(err);
      } else {
        if ( responseData.messages[0]['status'] === '0') {
          console.log('Message sent successfully.');
        } else {
          console.log(`Message failed with error: ${responseData.messages[0]['error-text']}`)
        }
      }
    })
  }
}

Привязка к контексту приложения

import {NexmoService} from './services/nexmo.service'

export class SmsServiceApplication extends BootMixin(
  ServiceMixin(RepositoryMixin(RestApplication)),
) {
  constructor(options: ApplicationConfig = {}) {
    super(options);
    this.bind('service.sms').to(NexmoService);

Это контроллер в котором пользуюсь сервисом

import {NexmoService} from '../services/nexmo.service';


export class SmsController {
  constructor(
    @inject('service.sms')
    public smsService: NexmoService,
  ) {}

  @post('/sendSms', {
    responses: {
      '200': {
        description: 'Send SMS',
        content: {
          'application/json': {
            schema: {
              type: 'object',
              properties: {
                to: {
                  type: 'string'
                },
                message: {
                  type: 'string'
                }
              },
            },
          },
        },
      },
    },
  })
  async sendSMS(
    @requestBody({
      content: {
        'application/json': {
          schema: {
            type: 'object',
            properties: {
              to: {
                type: 'string'
              },
              message: {
                type: 'string'
              },
            },
          },
        },
      },
    }) request: Request,
  ): Promise<object> {
    let data: any = request;
    this.smsService.sendSMS(data.to, data.message)
    return {
      to: data.to,
      message: data.message
    }
  }
}

и ошибка

Unhandled error in POST /sendSms: 500 TypeError: this.smsService.foo is not a function
    at SmsController.sendSMS (/Users/Sergio/smsService/sms-service/src/controllers/sms.controller.ts:63:21)
    at invokeTargetMethod (/Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/invocation.ts:255:47)
    at /Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/invocation.ts:232:12
    at Object.transformValueOrPromise (/Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/value-promise.ts:298:12)
    at invokeTargetMethodWithInjection (/Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/invocation.ts:227:10)
    at InterceptedInvocationContext.invokeTargetMethod (/Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/invocation.ts:118:14)
    at targetMethodInvoker (/Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/interceptor.ts:349:23)
    at /Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/interceptor-chain.ts:218:14
    at Object.transformValueOrPromise (/Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/value-promise.ts:298:12)
    at GenericInterceptorChain.invokeNextInterceptor (/Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/interceptor-chain.ts:213:12)
    at GenericInterceptorChain.next (/Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/interceptor-chain.ts:201:17)
    at GenericInterceptorChain.invokeInterceptors (/Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/interceptor-chain.ts:178:17)
    at Object.invokeInterceptors (/Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/interceptor-chain.ts:250:16)
    at /Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/interceptor.ts:351:14
    at tryCatchFinally (/Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/value-promise.ts:222:14)
    at Object.tryWithFinally (/Users/Sergio/smsService/sms-service/node_modules/@loopback/context/src/value-promise.ts:197:10)

1 Ответ

0 голосов
/ 18 июня 2020

У вас проблема с привязкой Здесь, в

this.bind('service.sms').to(NexmoService);

Просто нужно привязать услугу к вашему классу услуг как

   this.bind('service.sms').toClass(NexmoService);

Это разрешит вопрос. Счастливого лупбэка :)

...