代码之家  ›  专栏  ›  技术社区  ›  Abhinav Tyagi

DialogFlow Nodejs Fulfillment V2-Webhook方法调用在完成回调之前结束

  •  1
  • Abhinav Tyagi  · 技术社区  · 6 年前

    我正在使用开发DialogFlow Webhook dialogflow-fulfillment-nodejs 客户为一个城市寻找温度。当使用服务获取城市的温度时,一切都正常,并生成正确的响应,但即使调用了正确的方法,响应也不会发送给用户。

    Here is the issue in the Dialogflow GitHub repo

    代码

    function getTemp(agent) {
        const timeStart = new Date().getTime();
        console.info(`temp function called`);
        // agent.add(`Temperature in New Delhi is 50 degree Celsius!`); // This works
        serviceRequest.getTemp("New Delhi", function(resp){
            if (resp['status'] === 'Y') {
                // success
                const msg = `Temperature in New Delhi is ${resp['temp']} Celsius!`;
                console.log(`Speech Response -- ${msg}`);
                console.log(`Type of msg -> ${typeof msg}`);
                agent.add(msg);
            } else {
                // failure
                agent.add(`There was some error with the backend. Please try again later.`);
            }
            const timeEnds = new Date().getTime();
            console.log("\nComplete 'getTemp' process took " + (timeEnds - timeStart) + " milliseconds.")
        });
        console.log("------ temperature function ends here ------");
    }
    
    
    
    'getTemp': function (city, callback) {
            let respBack = {};
            doTimeOutTest(function(resp){
                respBack['temp'] = resp;
                respBack['status'] = 'Y';
                callback(respBack);
            });
    
        }
    
    
    function doTimeOutTest(callback){
        // below commented code takes < 10 ms to execute, but does not send any response back to dialogflow as call ends before it is executed
        // setTimeout(function() {
        //     callback("30 degree");
        // }, 1);
    
        // Below code works even when it takes more time to execute
        for(let i=0; i<10000; i++){
            for(let j=0; j<10000; j++){
                //
            }
        }
        callback("30 degree");
    }
    

    控制台日志

    当注释代码运行时

    >>>>>>> S E R V E R   H I T <<<<<<<
    
    temp function called
    ------ temperature function ends here ------
    Speech Response -- Temperature in New Delhi is 30 degree Celsius!
    Type of msg -> string
    
    Complete 'getTemp' process took 10 milliseconds.
    


    当未注释的代码运行时

    >>>>>>> S E R V E R   H I T <<<<<<<
    
    temp function called
    Speech Response -- Temperature in New Delhi is 30 degree Celsius!
    Type of msg -> string
    
    Complete 'getTemp' process took 77 milliseconds.
    ------ temperature function ends here ------
    

    nodejs对话框流源代码链接- https://github.com/dialogflow/dialogflow-fulfillment-nodejs/blob/master/src/dialogflow-fulfillment.js

    2 回复  |  直到 6 年前
        1
  •  2
  •   mattcarrollcode    6 年前

    function dialogflowHanlderWithRequest(agent) {
      return new Promise((resolve, reject) => {
        request.get(options, (error, response, body) => {
          JSON.parse(body)
          // processing code
          agent.add(...)
          resolve();
        });
      });
    };
    

    function dialogflowHandlerWithAxios(agent) {
      return callApi('www.google.com').then(response => {
        agent.add('My response');
      }).catch (error => {
        // do something
      })
    };
    
    function callApi(url) {
        return axios.get(url);
    }
    
        2
  •  0
  •   Dionis Beqiraj    6 年前

    then-request

    const thenRequest = require('then-request');
    
    function callApi(resolve){
    
        var req = thenRequest('POST', 'https://api_url_here...',{
          headers: 
           { 
            '.....': '....'
           }
        });
    
        req.done(function (res) {
            ....
            agent.add("Some text goes here...");
            ...
            resolve();
        });     
    }
    

    return new Promise((resolve, reject) => { 
        callApi(resolve); 
    });