1

我有一个回调函数,它从外部 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}`)
            })

4

1 回答 1

1

这是我在堆栈上的第一个 Awnser,所以请多多包涵。

我在最近的一个项目中遇到了同样的问题,您可以检查一些事情。

API 调用需要多长时间?

如果您的 API 调用需要很长时间,则值得检查 Lambda 函数的超时设置。AWS 控制台-> Lambda ->您的函数->基本设置->超时

您的 Lambda 函数是否在 API 调用完成之前完成?

我通过构建一个节点模块来处理我的业务逻辑来解决这个问题,该模块有一个名为 getNextSlot 的函数,它作为 Promise 返回。在这个函数中,我检查传入的事件并确定接下来需要引发哪个插槽,我的部分流程是调用一个大约需要 10 秒才能完成的 API 端点。

我使用request-promise包进行 api 调用,这个节点模块确保 lambda 函数在调用运行时保持运行。

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);
   });

无论如何,这为我解决了这个问题。

谢谢,

于 2018-06-29T09:18:15.360 回答