NestJS 和 ask SDK 服务注入

NestJS and ask SDK service injection

我正在尝试使用 nestjs 构建自定义 Alexa 网络服务。 如果我尝试从 AlexaController 调用 RequestHandler 内的服务,它不起作用,因为 this.那里不可用(如果我在 requestHandler 中尝试 console.log(this) 我看到 {canHandle, handle} )和服务器 returns 我认为该服务未定义。这是我的控制器:

import { Controller, HttpCode, Post, Req } from "@nestjs/common";
import {
  ErrorHandler,
  HandlerInput,
  RequestHandler,
  SkillBuilders,
} from "ask-sdk-core";
import { Response } from "ask-sdk-model";
import { Request } from "express";
import { MessagesService } from "src/services/messages/messages.service";

@Controller("alexa")
export class AlexaController {
  constructor(private myService: MessagesService) {}

  @Post()
  @HttpCode(200)
  async alexaSkill(@Req() req: Request) {
    let skill = SkillBuilders.custom()
      .addRequestHandlers(
        this.LaunchRequestHandler // welcome
      )
      .addErrorHandlers(this.ErrorHandler)
      .create();

    return skill
      .invoke(req.body)
      .then((res) => {
        return res;
      })
      .catch((err) => {
        console.log(err);
      });
  }

  LaunchRequestHandler: RequestHandler = {
    canHandle(handlerInput: HandlerInput): boolean {
      return handlerInput.requestEnvelope.request.type === "LaunchRequest";
    },
    handle(handlerInput: HandlerInput): Response {
      const speechText = "Welcome to the Alexa Skills Kit, you can say hello!";

      // here I want to call this.myService to do something.
      this.myService.something("hi Alexa");
      // it returns me this error: cannot call something of undefined

      return handlerInput.responseBuilder
        .speak(speechText)
        .reprompt(speechText)
        .withSimpleCard("Hello World", speechText)
        .getResponse();
    },
  };

  ErrorHandler: ErrorHandler = {
    canHandle(handlerInput: HandlerInput, error: Error): boolean {
      return true;
    },
    handle(handlerInput: HandlerInput, error: Error): Response {
      console.log(`Error handled: ${error.message}`);

      return handlerInput.responseBuilder
        .speak("Sorry, I can't understand the command. Please say again.")
        .reprompt("Sorry, I can't understand the command. Please say again.")
        .getResponse();
    },
  };
}

这是我的 AlexaModule:

import { Module } from "@nestjs/common";
import { MessagesService } from "src/services/messages/messages.service";
import { AlexaController } from "./alexa.controller";

@Module({
  controllers: [AlexaController],
  providers: [MessagesService],
})
export class AlexaModule {}

如何使服务在 RequestHandler 中可见?有什么建议吗? 提前致谢

Javascript 中的 this 关键字可以根据其访问范围来引用不同的内容。这是 Javascript 开发人员的一个常见混淆来源,如果您快速 Google.

,您可以阅读大量关于 this 作用域的内容

话虽这么说,自从在 Javascript 中引入箭头函数以来,由此引起的许多常见错误现在都已“解决”,因为它们会自动从外部范围捕获 this 上下文这通常是您想要的。

尝试使用箭头函数而不是使用常规函数重写您的处理程序:

LaunchRequestHandler: RequestHandler = {
        canHandle: (handlerInput: HandlerInput) => {
          return handlerInput.requestEnvelope.request.type === "LaunchRequest";
        },
        handle: (handlerInput: HandlerInput) => {
          const speechText = "Welcome to the Alexa Skills Kit, you can say hello!";
    
          this.myService.something("hi Alexa");
    
          return handlerInput.responseBuilder
            .speak(speechText)
            .reprompt(speechText)
            .withSimpleCard("Hello World", speechText)
            .getResponse();
        },
      };