You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决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

火山引擎 最新活动