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();
},
};
我正在尝试使用 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();
},
};