2017-12-27 94 views
0

我需要一些帮助来确定SQL查询的语法,同时通过连接到Google云Mysql数据库的api.ai webhook &使用它们。 虽然查询工作,在 '请求被超时'如何从MySql数据库中获取结果并将它们发送回API.ai

'use strict'; 
const mysql = require('mysql'); 

exports.name = (req, res) => { 

    let action = req.body.result['action']; 

if (action === 'apple') { 


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

     res.setHeader('Content-Type', 'application/json'); 
     res.send(JSON.stringify(output)); 
    }).catch((error) => { 

     res.setHeader('Content-Type', 'application/json'); 
     res.send(JSON.stringify(error)); 
    }); 

} 
}; 

function callDB() { 
    return new Promise((resolve, reject) => { 

    try { 

     var connection = mysql.createConnection({ 
      host: "<host>", 
      user: "<user>", 
      password: "<pass>", 
      database: "<DB>" 
     }); 

     connection.query("SELECT description AS solution FROM mtable WHERE title LIKE '%Breakfast%'", function (error, results, fields) { 
      if (!error) { 

       let response = "The result is: " + results[0].solution; 
       response = response.toString(); 
       let output = {'speech': response, 'displayText': response}; 
       console.log(output); 
       resolve(output); 

      } else { 

       let output = {'speech': 'Error. Query Failed.', 'displayText': 'Error. Query Failed4.'}; 
       console.log(output); 
       reject(output); 

      } 
     }); 
     connection.end(); 

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

    } 

} 
); 
} 

如果我取代与此查询,它的工作原理:

'SELECT描述AS解决方案从mtable WHERE ID LIKE 1001'

ID是列名,只有id`s

标题列名和标题,如早餐包等

这是网络挂接JSON所示的错误的部分:

"metadata": { 
    "intentId": "<id>", 
    "webhookUsed": "true", 
    "webhookForSlotFillingUsed": "false", 
    "webhookResponseTime": 5000, 

"status": { 
"code": 206, 
"errorType": "partial_content", 
"errorDetails": "Webhook call failed. Error: Request timeout.", 
"webhookTimedOut": true 
    }, 

我引用的代码如下线程, How to get results from MySql DB using node.js MySQL and send them back to API.ai

回答

0

似乎是在您的查询字符串声明中的错别字(接近“%早餐% ''):

connection.query('SELECT description AS solution FROM mtable WHERE title LIKE '%Breakfast%'', function (error, results, fields) { 

在分配您的查询字符串变量, 'SELECT描述AS解决方案从mtable WHERE标题LIKE '%早餐%'' 被解释为一个数字(因为%运营商)。

以任何方式修复您的单引号是否有帮助?

connection.query("SELECT description AS solution FROM mtable WHERE title LIKE '%Breakfast%'", function (error, results, fields) { 
+0

问候,这确实解决了错误,但我仍然没有从数据库中获取任何数据。 json只是说超时。 (API.ai在超时之前仅等待5秒,可能是什么解决方案?“状态”:{ “code”:206, “errorType”:“partial_content”, “errorDetails”:“Webhook调用失败。错误:请求超时。“, ”webhookTimedOut“:true – Jarvis

+0

我对API.ai并不熟悉我只在您的JavaScript代码中发现了一些奇怪的东西 如果它解决了您在问题中提到的第一个问题,您的问题与关于您当前问题(包含错误消息)和最重要的信息相关,为每项涉及的技术(api.ai等)添加标签。 – RogerC

0

问题必须在您的服务器端与MySQL。我每天都这样做,并且在5秒钟内用于查询的情况下,它可以正常工作。

可能是你的Where子句正在创建全表扫描,因此超时返回Diagflow(> 5秒)或db连接中断。

您需要在例程和结束周期之前设置定时器,查看您的持续时间。单独从bash脚本运行查询并查看需要多长时间。你会发现超时正在发生的地方。在条件两边都有搜索参数(%)肯定会比搜索字符串的开始时间(意味着以搜索开始)和%search%(找到包含的任何子字符串)花费更长的时间。

祝你好运。

相关问题