Lex chat bot error:在同一个话语中达到履行lambda的第二次执行

时间:2018-01-12 16:20:15

标签: node.js amazon-web-services aws-lambda amazon-lex

我已阅读Lex Docs on Responses 我搜索过并发现:
- 未答复的question on same error.
- 未答复的similar question but in Python.
- 未答复的similar question in Amazon Dev Forum.

所以我的问题仍然存在。是什么导致/如何在Lex chat bot中修复此错误:

  

发生错误:Lambda响应无效:
  在同一个话语中达到了履行lambda的第二次执行

只有在尝试使用Delegate进行响应时才会出现此错误。这是代表响应的AWS lambda(node.js 6.10)代码:

exports.handler = (event, context, callback) => {
    try {
        intentProcessor(event,
            (response) => {
                callback(null, response);
            });
    } catch (err) {
        callback(err);
    }
};

function intentProcessor(intentRequest, callback) {
     respond = delegate(sessionAttributes,intentRequest['currentIntent']['slots']);
     callback(respond);
}

function delegate(sessionAttributes, slots){
    return {
        sessionAttributes,
        dialogAction: {
            type: "Delegate",
            slots
        }
    };
}

我已经确认响应按预期返回,其中包含每个Docs委托的最低要求,即sessionAttributes和DialogAction:type和slots。插槽按预期返回null。

其他可能的相关信息:
- 意图有多个话语 - 意图有多个插槽 - 不需要任何插槽。

非常感谢任何可能导致此错误的建议或信息!

1 个答案:

答案 0 :(得分:2)

我的猜测是你在delegate()中呼叫FulfillmentCodeHook。当委托被调用时,意味着

  

Lambda函数指示Amazon Lex选择下一步行动

现在,Lambda函数中有两个操作,DialogCodeHookFulfillmentCodeHook。如果您在DialogCodeHook中,则delegate将调用FulfillmentCodeHook。但如果您在FulfillmentCodeHook中,则会抛出错误。

但是,如果你在FulfillmentCodeHook中,并且由于某种原因你想要修改任何slot的值,那么你可以将slot的值设置为 null 和然后调用委托传递新的插槽集。这样,委托将再次调用DialogCodeHook。

来自AWS文档:

  

如果字段的值未知,则必须将其设置为null。您   如果您的fufillment将获得DependencyFailedException异常   函数返回Delegate对话框操作而不删除任何   槽。

希望它有所帮助。