首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在对话框流API V2 DB调用中获得期望的结果

无法在对话框流API V2 DB调用中获得期望的结果
EN

Stack Overflow用户
提问于 2018-08-06 14:23:34
回答 1查看 718关注 0票数 1

我正在尝试连接到MySQL db,获取结果并将其传递给将显示给用户的代理。由于DB查询是异步的,所以在解析数据之后,我已经使用允诺来获得回调并发送响应。我确实在日志中获得响应,但函数执行在此之前结束,它似乎不等待,然后是调用。

以下是代码:

代码语言:javascript
复制
var sqlQuery = '';
  var dbResults = '';
exports.dialogflowFirebaseFulfillment = 
functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  var reply = '';


  function welcome(agent) {
    agent.add(`Welcome to my agent!`);
  }

  function fallback(agent) {
    agent.add(`I didn't understand`);
    agent.add(`I'm sorry, can you try again?`);
}

    function getBalance(){

                sqlQuery = 'select * from master_balance where account_no = \'1234567\'';

                callDB().then((results) => {

                var balance_type = request.body.queryResult.parameters['balance_type'];
                if(balance_type == 'SMS'){
                    console.log('In SMS');
                    reply = 'You have '+ results[0].bal_sms +' SMS left in your account';
                }
                else if(balance_type == 'Voice'){
                    console.log('In Voice-- from DB--'+results[0].bal_call);
                    reply = 'Your Voice balance is $ '+results[0].bal_call;
                }
                else if(balance_type == 'Data'){
                    console.log('In Data');
                    reply = 'You have '+results[0].bal_data +' MB left in your account';
                }
                else{
                    console.log('In Ahh');
                    reply = 'Ahh, there seems to be some issue. Please wait';
                }
                agent.add(reply);
                 return 1;
                 }).catch((error) => {
                     console.log('in catch----'+error);

                    });
        return 1;
     }



  let intentMap = new Map();
  intentMap.set('Default Welcome Intent', welcome);
  intentMap.set('Default Fallback Intent', fallback);
  intentMap.set('Query.Balance', getBalance);

  agent.handleRequest(intentMap);
});

function callDB() {
        return new Promise((resolve, reject) => {
        console.log('-- In callDB--'+sqlQuery);
        try {
            var connection = mysql.createConnection({
                socketPath: '/cloudsql/' + connectionName,
                user: dbUser,
                password: dbPass,
                database: dbName
            });
            connection.query(sqlQuery, function (error, results, fields) {
                if (!error) {

                    console.log('--In no error 2--'+results[0]);
                    resolve(results);

                } else {

                    let output = {'speech': 'Error. Query Failed.', 'displayText': 'Error. Query Failed.'};
                    console.log('--- in else----'+error);

                    reject(results);

                }
            });
            connection.end();

        } catch (err) {
            let results = {'speech': 'try-cacth block error', 'displayText': 'try-cacth block error'};
            console.log(results);
            reject(results);

        }

    }
    );
}

请帮我解决我可能做错的事。另一件事是,当谈到Node时,我是个菜鸟。

提前谢谢!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-06 19:41:20

问题是,如果使用异步函数,那么意图处理程序也必须返回承诺。仅作为then()子句的一部分发送答复是不够的,还必须返回then()是其一部分的承诺。

在您的例子中,这看起来相当容易。在getBalance()函数中,您将返回callDB().then().catch()结果,这是一个承诺。(then()和‘`catch()返回一个承诺)

代码语言:javascript
复制
return callDB().then((results) => {
  ....
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51709853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档