Alexa python 获取请求 returns 空。拉姆达很好

Alexa python get request returns null. Lambda is fine

您好,我正在尝试使用请求从后端请求 Alexa 获得响应。我在这些示例中使用 Python:https://github.com/alexa/skill-sample-python-fact。但是我的后端是 NodeJS。

来自我的 Lambda:

URL = 'https://alexa-app-nikko.herokuapp.com/alexa'

def get_post_response():
    r = requests.get(URL)

    speech_output = str(r.text)
    return response(speech_response(speech_output, True))

在我的后端,它被路由到 /alexa:

router.get('/', function(request, response) {
    //console.log('Logged from Alexa.');
    response.send('Hello World, Alexa!');
});

我在 Lambda 上对其进行了测试,结果很好:

{
  "version": "1.0",
  "response": {
    "outputSpeech": {
      "type": "PlainText",
      "text": "Hello World, Alexa!"
    },
    "shouldEndSession": true
  }
}

但是我在技能输出上得到了 null 或来自 Alexa 的响应:

"There was a problem with the requested skill's response"

我如何从开发人员控制台进行调试,因为看起来 Lambda 没问题。

我不知道这个问题和我的要求有什么关系。现在正在运行。

def on_intent(request, session):
    """ called on receipt of an Intent  """

    intent_name = request['intent']['name']
    #intent_slots = request['intent']['slots']

    # process the intents
    if intent_name == "DebugIntent":
        return get_debug_response()
    elif intent_name == "PostIntent":
        return get_post_response()
    elif intent_name == "PowerIntent":
        return get_power_response(request)
        #return get_power_response(intent_slots)
# ----------- Amazon Built-in Intents -----------------
    elif intent_name == "AMAZON.HelpIntent":
        return get_help_response()
    elif intent_name == "AMAZON.StopIntent":
        return get_stop_response()
    elif intent_name == "AMAZON.CancelIntent":
        return get_stop_response()
    elif intent_name == "AMAZON.FallbackIntent":
        return get_fallback_response()
    else:
        print("invalid Intent reply with help")
        return get_help_response()

我调试了它,我得到的是关键字 'slots' 的问题,所以我在我的代码中删除了 intent_slots = request['intent']['slots'],我也用它来将它传递给另一个函数 return get_power_response(intent_slots).我将其注释掉并替换或只是放置 def on_intent(request, session): 中的原始 request

根据您自己的回答:

问题是,当您调用 LaunchIntent 或其他意图如 AMAZON.StopIntent 时,它们中没有密钥 "slots"。你试图访问 slots 的值,它应该抛出 KeyError

你可以做的是,当你确定调用任何使用某些槽的特定意图时,然后你尝试访问它们。

我就是这样做的:

def getSlotValue(intent, slot):
    if 'slots' in intent:
        if slot in intent['slots']:
            if 'value' in intent['slots'][slot] and len(intent['slots'][slot]['value']) > 0:
                return intent['slots'][slot]['value']

    return -1

并尝试访问您意图函数中的插槽值(在您的 get_post_responseget_power_response 中)。