Ошибка бота в чате лекса: достигнуто второе исполнение лямбды на том же высказывании

Я прочитал Lex Docs на Ответы.
Я искал и нашел:
- оставшийся без ответа вопрос по той же ошибке.
- Безответный аналогичный вопрос, но в Python.
- Оставшийся без ответа подобный вопрос в Amazon Dev Forum.

Так что мой вопрос остается. Что вызывает / Как исправить эту ошибку в Lex Chat Bot:

Произошла ошибка: неверный лямбда-ответ:
Достигнуто второе исполнение исполнения лямбда по тому же высказыванию

Ошибка возникает только при попытке ответить делегатом. Вот мой лямбда-код AWS (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
        }
    };
}

Я подтвердил, что ответ возвращается, как и ожидалось, с минимальными требованиями для Делегата на Документы, которые являются sessionAttributes и DialogAction: тип и слоты. Слоты возвращаются нулевые, как и ожидалось.

Дополнительная, возможно, актуальная информация:
- У намерения есть несколько высказываний.
- У цели есть несколько слотов.
- Ни один из слотов не требуется.

Любые предложения или информация о том, что может вызвать эту ошибку, высоко ценится!

1 ответ

Решение

Я думаю, ты звонишь delegate() в FulfillmentCodeHook, Когда делегат вызывается, это означает, что

Лямбда-функция предписывает Amazon Lex выбрать следующий курс действий

Теперь в лямбда-функции есть два действия: DialogCodeHook а также FulfillmentCodeHook, Если вы находитесь в DialogCodeHook, то delegate вызовет FulfillmentCodeHook. Но если вы находитесь в FulfillmentCodeHook, он выдаст ошибку.

Однако, если вы находитесь в FulfillmentCodeHook, и по какой-то причине вы хотите изменить значение любого slot тогда вы можете установить значение этого slot обнулить, а затем вызвать делегата, передавшего новый набор слотов. Таким образом, делегат снова вызовет DialogCodeHook.

Из документов AWS:

Если значение поля неизвестно, вы должны установить его на ноль. Вы получите исключение DependencyFailedException, если ваша функция fufillment возвращает диалоговое действие Delegate без удаления каких-либо слотов.

Надеюсь, поможет.

Другие вопросы по тегам