NestJS和ask-SDK服务注入

NestJS和ask-SDK服务注入,nestjs,alexa-skills-kit,ask-sdk,Nestjs,Alexa Skills Kit,Ask Sdk,我正在尝试用nestjs构建一个定制的Alexa Web服务。 在AlexaController中,如果我尝试调用RequestHandler中的服务,它将不起作用,因为。在那里不可用(如果我在requestHandler中尝试console.log(this),我会看到{canHandle,handle}),服务器会返回我服务未定义。这是我的控制器: import{Controller,HttpCode,Post,Req}来自“@nestjs/common”; 进口{ 错误处理程序, Hand

我正在尝试用nestjs构建一个定制的Alexa Web服务。 在AlexaController中,如果我尝试调用RequestHandler中的服务,它将不起作用,因为。在那里不可用(如果我在requestHandler中尝试console.log(this),我会看到{canHandle,handle}),服务器会返回我服务未定义。这是我的控制器:

import{Controller,HttpCode,Post,Req}来自“@nestjs/common”;
进口{
错误处理程序,
HandlerInput,
请求处理程序,
技术工人,
}从“询问sdk核心”;
从“ask sdk模型”导入{Response};
从“express”导入{Request};
从“src/services/messages/messages.service”导入{MessagesService};
@控制员(“alexa”)
导出类控制器{
构造函数(私有myService:MessagesService){}
@Post()
@HttpCode(200)
异步请求(@Req()Req:Request){
let skill=SkillBuilders.custom()
.addRequestHandlers(
this.LaunchRequestHandler//welcome
)
.AddErrorHandler(此.ErrorHandler)
.create();
回击技术
.invoke(请求主体)
。然后((res)=>{
返回res;
})
.catch((错误)=>{
控制台日志(err);
});
}
LaunchRequestHandler:RequestHandler={
canHandle(handlerInput:handlerInput):布尔值{
return handlerInput.requestEnvelope.request.type==“LaunchRequest”;
},
句柄(handlerInput:handlerInput):响应{
const speechText=“欢迎使用Alexa技能工具包,您可以打招呼!”;
//在这里,我想调用这个.myService来做一些事情。
这个.myService.something(“嗨,Alexa”);
//它返回我这个错误:不能调用未定义的内容
返回handlerInput.responseBuilder
.发言(演讲稿)
.reprompt(演讲稿)
.withSimpleCard(“Hello World”,speechText)
.getResponse();
},
};
ErrorHandler:ErrorHandler={
canHandle(handlerInput:handlerInput,错误:error):布尔值{
返回true;
},
句柄(handlerInput:handlerInput,错误:error):响应{
log(`Error handled:${Error.message}`);
返回handlerInput.responseBuilder
.说话(“对不起,我听不懂命令。请再说一遍。”)
.reprompt(“对不起,我听不懂命令。请再说一遍。”)
.getResponse();
},
};
}
这是我的模块:

从“@nestjs/common”导入{Module}”;
从“src/services/messages/messages.service”导入{MessagesService};
从“/alexa.controller”导入{alexa controller}”;
@模块({
控制器:[AlexaController],
提供者:[MessagesService],
})
导出类模块{}
如何使服务在RequestHandler中可见?有什么建议吗?
提前感谢

Javascript中的
这个
关键字可以根据访问的范围引用不同的内容。对于Javascript开发人员来说,这是一个常见的困惑源,如果您快速搜索一下,您可以阅读大量关于
这个
范围的内容

这就是说,自从在Javascript中引入箭头函数以来,许多由此导致的常见错误现在都已“解决”,因为它们将自动从外部范围捕获
上下文,而外部范围通常是您所追求的范围

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

LaunchRequestHandler:RequestHandler={
canHandle:(handlerInput:handlerInput)=>{
return handlerInput.requestEnvelope.request.type==“LaunchRequest”;
},
句柄:(handlerInput:handlerInput)=>{
const speechText=“欢迎使用Alexa技能工具包,您可以打招呼!”;
这个.myService.something(“嗨,Alexa”);
返回handlerInput.responseBuilder
.发言(演讲稿)
.reprompt(演讲稿)
.withSimpleCard(“Hello World”,speechText)
.getResponse();
},
};