我试图从升级V1我的技能要求SDK V2。我使用的addErrorHandlers
的StandardSkillBuilder
功能有问题。当我在我的意图抛出一个错误,我的自定义错误处理程序不会被调用。我不知道如何使用它。
index.ts
import { SkillBuilders } from 'ask-sdk';
import { LambdaHandler } from 'ask-sdk-core/dist/skill/factory/BaseSkillFactory';
// import intents
import LaunchIntent from './alexa-intents/launch.intent';
import CustomErrorHandler from './alexa-intents/custom-error-handler';
function buildAlexaLambdaHandler(): LambdaHandler {
return SkillBuilders.standard()
.addRequestHandlers(
new LaunchIntent()
)
.addErrorHandlers(new CustomErrorHandler())
.lambda();
}
export const handler = buildAlexaLambdaHandler();
launch.intent.ts(抛出一个测试误差)
import { HandlerInput, RequestHandler } from 'ask-sdk';
import { Response } from 'ask-sdk-model'
export default class LaunchIntent implements RequestHandler {
canHandle(handlerInput: HandlerInput): boolean {
const request = handlerInput.requestEnvelope.request;
return request.type === 'LaunchRequest';
}
handle(handlerInput: HandlerInput): Response {
const responseBuilder = handlerInput.responseBuilder;
const deviceId = handlerInput.requestEnvelope.context.System.device.deviceId;
if (deviceId) {
console.log('throwing error');
throw new Error('test error');
}
return responseBuilder
.speak('welcome')
.getResponse();
}
}
自定义错误handler.ts(试图赶上测试误差)
import { HandlerInput, ErrorHandler } from 'ask-sdk';
import { Response } from 'ask-sdk-model';
export default class CustomErrorHandler implements ErrorHandler {
canHandle(handlerInput: HandlerInput): boolean {
return true;
}
handle(handlerInput: HandlerInput, error: Error): Response {
const request = handlerInput.requestEnvelope.request;
const deviceId = handlerInput.context.System.device.deviceId;
console.dir(error);
return handlerInput.responseBuilder
.speak('there was an error')
.getResponse();
}
}
我在本地运行我的技能使用bespoken-tools
LambdaServer
:
import * as bst from 'bespoken-tools';
const server = new bst.LambdaServer('./src/index', 10000, true);
server.start(() => console.log('[init.dev]: server started and listening on port 10000!'));
在我的控制台日志,我看到我的控制台消息从发射意图处理“抛出的错误”,但我从来没有看到所谓的CustomErrorHandler
或从任何控制台日志。在Alexa的开发者控制台模拟器,我得到“有与所请求的技能的响应问题”,因为没有响应过由CustomerErrorHandler
增加。
Someone on the Alexa forums helped me find my issue.
基本上,我CustomErrorHandler
不当访问deviceId
和投掷的错误本身。改变在CustomErrorHandler
这一行后,问题就解决了,并如预期的错误处理工作。
const deviceId = handlerInput.requestEnvelope.context.System.device.deviceId;
代替
const deviceId = handlerInput.context.System.device.deviceId;
别的东西,可能是很好的做法是有一个备份错误处理程序捕获错误在你的错误处理程序只是简单地打印出错误,以避免任何在备份处理机走错了。