如何解决Alexa开发者控制台中「请求的技能响应存在问题」错误
修复你的Alexa Lambda技能响应错误
嘿,我帮你找出了代码里几个导致INVALID_RESPONSE错误的关键问题,咱们一步步来解决:
问题1:onIntent函数的参数与变量引用错误
你的onIntent函数定义的参数名不对,而且内部用了未定义的intentRequest变量来获取意图信息——这会直接抛出异常,导致Alexa接收不到有效响应。需要把函数参数修正为intentRequest,再从这个参数里正确提取意图对象。
问题2:handleTempRequest没有正确返回响应
这个函数只是调用了buildSpeechletResponse构建响应,但既没有把响应传给Alexa的回调函数,也没接收response参数。必须把response回调传递进去,才能让Alexa收到正确的语音回复。
问题3:缺少SessionEndedRequest的处理逻辑
当技能出现错误时,Alexa会发送SessionEndedRequest,你的代码完全没处理这个请求类型,这也会导致响应异常。最好加上对应的处理分支,避免技能崩溃。
问题4:未定义的buildSpeechletResponseWithoutCard函数
你的onLaunch方法里调用了这个函数,但代码里根本没定义它。直接用已有的buildSpeechletResponse并传入空标题即可替代。
修正后的完整代码
function onLaunch(launchRequest, session, response) { var output = 'Welcome to Temp World'; var reprompt = 'Say temp world'; // 用已定义的buildSpeechletResponse替代未定义的函数,标题传空字符串 response(session.attributes, buildSpeechletResponse("", output, reprompt, false)); console.log("onLaunch requestId=" + launchRequest.requestId + ", sessionId=" + session.sessionId); } function onIntent(intentRequest, session, response) { console.log("onIntent requestId=" + intentRequest.requestId + ", sessionId=" + session.sessionId); // 正确从intentRequest中获取意图对象 var intent = intentRequest.intent; var intentName = intent.name; if(intentName === 'TempIntent') { // 把response回调传递给处理函数 handleTempRequest(response); } else { // 处理未知意图,返回友好提示,避免抛出异常 response(session.attributes, buildSpeechletResponse("", "Sorry, I didn't catch that.", "Could you say temp world again?", false)); } } // 修改处理函数,接收response参数并返回响应 function handleTempRequest(response) { response(null, buildSpeechletResponse("", "welcome to temp world", "", true)); } function buildSpeechletResponse(title, output, repromptText, shouldEndSession) { return { outputSpeech: { type: "PlainText", text: output }, card: { type: "Simple", title: title, content: output }, reprompt: { outputSpeech: { type: "PlainText", text: repromptText } }, shouldEndSession: shouldEndSession }; } // 新增SessionEndedRequest处理逻辑 function onSessionEnded(sessionEndedRequest, session) { console.log("onSessionEnded requestId=" + sessionEndedRequest.requestId + ", sessionId=" + session.sessionId); // 这里可以添加会话结束后的清理逻辑,比如保存用户数据 } // Lambda主入口函数,正确路由所有请求类型 exports.handler = function(event, context) { try { if (event.session.new) { onSessionStarted({ requestId: event.request.requestId }, event.session); } switch(event.request.type) { case "LaunchRequest": onLaunch(event.request, event.session, context.succeed); break; case "IntentRequest": onIntent(event.request, event.session, context.succeed); break; case "SessionEndedRequest": onSessionEnded(event.request, event.session); context.succeed(); break; default: throw new Error("Unknown request type: " + event.request.type); } } catch (e) { context.fail("Exception occurred: " + e); } }; // 会话初始化函数(可选,用于设置默认会话属性) function onSessionStarted(sessionStartedRequest, session) { console.log("onSessionStarted requestId=" + sessionStartedRequest.requestId + ", sessionId=" + session.sessionId); // 比如初始化会话属性:session.attributes = {}; }
关键修正说明
- 修正了
onIntent的参数命名和意图对象的获取逻辑,现在能正确识别TempIntent handleTempRequest现在会把构建好的响应通过response回调返回给Alexa- 添加了完整的请求路由逻辑,覆盖所有Alexa请求类型
- 替换了未定义的函数调用,避免运行时错误
- 处理了未知意图的情况,不再抛出异常,而是返回友好提示
现在你把这段代码替换到Lambda里,再去Alexa控制台测试,应该就能正常返回"welcome to temp world"了!
内容的提问来源于stack exchange,提问作者archit969




