【问题标题】:Dialogflow fulfillment two requests in te same intentDialogflow 以相同的意图实现两个请求
【发布时间】:2020-10-13 23:49:26
【问题描述】:

我需要为一个简单的意图发出两个请求。用户回答了一些问题,我用不同的参数向同一个 API 发出这两个请求。

我尝试了几件事,最后一次尝试使用 Promise 发出这两个请求并返回数据。

这些函数执行我的 put 并获得 return:

async function getData(url, config, body) {
        let result = await axios.put(url, body, config);
        let returnValues = [];
        
        if(result.data){
            if (Array.isArray(result.data)) {
                result.data.forEach(item => {             
                    returnValues.push(item.message);
                });
            } else {
                returnValues.push(result.data.message);
            }
        }
        
        return returnValues;
    }

这些函数是我的处理程序

function getDocumentHandler(agent){   
    const url = 'https://myUrl';
    const authorization = 'myBasicAuth';
    const dateformat = 'YYYYMMDD';

    const config = {
        headers: {
            'Authorization': 'Basic ' + authorization ,
            'Content-Type': 'application/json'
        }
    };

    const value = agent.parameters.value1;
    const flag = agent.parameters.flag;

    var xmlBody = '<value>' + value + '</value>';
    

    return new Promise((resolve, reject) => {
        getData(url, config, xmlBody).then(
            (res) => {
                if(res != null && res.length > 0){
                    console.log('Values without flag: ', res.length);
                    res.forEach(item => {
                        console.log('Item: ' , item);
                        agent.add(item);
                    });
                }
            }
        );

        if(flag){
            xmlBody += ' <flag>true</flag>';

            getData(url, config, xmlBody).then(
                (res) => {
                    if(res != null && res.length > 0){
                        console.log('Values with flag: ', res.length);
                        res.forEach(item => {
                            console.log('Item: ' , item);
                            agent.add(item);
                        });
                    }
                }
            );
        }

        resolve();
    });   
}
    

重要信息:

  • 当我在“节点项目”中执行此代码时,可以正常工作并且控制台日志正确
  • 当我在 DialogFlow 中执行时,我通过 Google 控制台看到控制台日志,但在代理中看不到。

谁能帮帮我?

谢谢

【问题讨论】:

    标签: javascript node.js promise dialogflow-es dialogflow-es-fulfillment


    【解决方案1】:

    当 Intent 处理程序返回一个 Promise 时,您的 WebhookClient 将根据您使用 add() 函数添加的响应创建一个 webhook 响应,然后在完成 Promise 后将其发送给您的代理。

    在您的情况下,即使您的包含 agent.add() 的 getData() 承诺处理程序尚未完成,您的意图处理程序返回的承诺也已完成,因为您的 getData() 函数在调用之前不会等待resolved() 函数来履行您的意图处理程序返回的承诺。因此,您的 WebhookClient 将无法创建要发送回您的代理的响应,因为没有定义响应。

    有两种方法可以解决此问题。第一个是通过在 getData() 承诺处理程序中调用意图处理程序返回的承诺的 resolved() 函数。

    return new Promise(async (resolve, reject) => {
            await getData(url, config, xmlBody).then(
                (res) => {
                    if(res != null && res.length > 0){
                        console.log('Values without flag: ', res.length);
                        res.forEach(item => {
                            console.log('Item: ' , item);
                            agent.add(item);
                        });
                    }
                }
            );
    
            if(flag){
                xmlBody += ' <flag>true</flag>';
    
                await getData(url, config, xmlBody).then(
                    (res) => {
                        if(res != null && res.length > 0){
                            console.log('Values with flag: ', res.length);
                            res.forEach(item => {
                                console.log('Item: ' , item);
                                agent.add(item);
                            });
                        }
                        resolve();
                    }
                );
            }
    }
    

    第二个是在你的承诺处理程序中添加async关键字,并在你的承诺处理程序中调用你的getData函数时添加await关键字。

    return new Promise(async (resolve, reject) => {
            await getData(url, config, xmlBody).then(
                (res) => {
                    if(res != null && res.length > 0){
                        console.log('Values without flag: ', res.length);
                        res.forEach(item => {
                            console.log('Item: ' , item);
                            agent.add(item);
                        });
                    }
                }
            );
    
            if(flag){
                xmlBody += ' <flag>true</flag>';
                await getData(url, config, xmlBody).then(
                    (res) => {
                        if(res != null && res.length > 0){
                            console.log('Values with flag: ', res.length);
                            res.forEach(item => {
                                console.log('Item: ' , item);
                                agent.add(item);
                            });
                        }
                    }
                );
            }
    
            resolve();
    }
    

    当你await一个promise时,函数会以非阻塞的方式暂停,直到promise被实现。

    但是,如果您的实现代码是使用 Dialogflow 的内联编辑器部署的,请注意内联编辑器不支持异步函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 2023-04-01
      相关资源
      最近更新 更多