Amazon Lex — вызов слота не работает внутри обратного вызова

У меня есть функция обратного вызова, которая получает данные из внешнего API и зависит от проверки данных, которую я пробовал для извлечения слота внутри обратного вызова, но похоже, что извлечение не работает внутри обратного вызова. Пожалуйста, найдите фрагмент кода ниже,

GetCustomerDetails().then(response => {


                var serializedcustomerDetails = convert.xml2json(response.data, {
                    compact: true,
                    spaces: 2
                });

                var customerDetails = JSON.parse(serializedcustomerDetails);


                let filteredCustomerDetails = _.filter(customerDetails.CustomerInfo.CustomerDetails, function (o) {
                    return o.CustomerName._text.includes(customerName);
                })

                

                if (filteredCustomerDetails.length == 1) {

                   
                    callback(elicitSlot(outputSessionAttributes, intentRequest.currentIntent.name,
                        intentRequest.currentIntent.slots, '​CustomerCode', {
                            contentType: 'PlainText',
                            content: `Do you mean ${filteredCustomerDetails[0].CustomerName._text} of ${filteredCustomerDetails[0].SpecialityName._text} department?`
                        }));

                    return;

                }

            }).catch(error => {
                console.log(`${error}`)
            })


person Vijayanath Viswanathan    schedule 27.06.2018    source источник


Ответы (1)


Это мой первый Awnser в стеке, поэтому, пожалуйста, потерпите меня.

Я столкнулся с той же проблемой в недавнем проекте, и есть несколько вещей, которые вы можете проверить.

Сколько времени занимает вызов API?

Если ваш вызов API занимает много времени, стоит проверить настройки времени ожидания в вашей функции Lambda. Консоль AWS -> Lambda -> Ваша функция -> Основные настройки -> Время ожидания.

Заканчивается ли ваша функция Lambda до выполнения вызова API?

Я исправил эту проблему, создав модуль узла для обработки моей бизнес-логики. В модуле есть функция getNextSlot, которую он возвращает как обещание. Внутри этой функции я проверяю входящее событие и выясняю, какой слот мне нужно вызвать следующим. Частью моего потока является вызов конечной точки API, выполнение которого занимает около 10 секунд.

Я использую пакет request-promise для выполнения вызова API, этот модуль узла гарантирует, что лямбда-функция продолжает работать во время выполнения вызова.

exports.getData = function (url, data) {
    var pr = require("request-promise");

    var options = {
        method: 'POST',
        url: 'api.example',
        qs: {},
        headers:
            {
                'Content-Type': 'application/json'
            },
        body: {
            "example": data
        },
        json: true,
        timeout: 60000
    };

    return pr(options);
}

В моем основном коде я вызываю эту функцию как:

apiModule.getData("test", "data")
    .then(function (data) {
        //Execute callback
   })
    .catch(function (error) {
        console.log(error);
        reject(error);
   });

В любом случае это решило проблему для меня.

Спасибо,

person George Hastings    schedule 29.06.2018