如何从MySql DB获取结果并将其发送回API.ai

时间:2017-12-27 14:04:22

标签: javascript mysql dialogflow

我需要一些帮助来确定SQL查询的语法,同时通过api.ai webhook&连接到Google云Mysql数据库。 虽然查询有效,但该请求会超时'

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

    }

}
);
}

如果我用这个替换查询,它可以工作:

&#39; SELECT description AS解决方案FROM mtable WHERE id LIKE 1001&#39;

id是一个只有id`s

的列名

title是一个列名,包含早餐包装等标题。

这是webhook 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

2 个答案:

答案 0 :(得分:0)

您的查询字符串声明中似乎有一个拼写错误('%Breakfast%''附近):

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

将查询字符串分配给变量时,'SELECT description AS solution FROM mtable WHERE title LIKE'%Breakfast%''被解释为数字(因为%运算符)。

修复单引号是否有帮助?

{{1}}

答案 1 :(得分:0)

问题必须在你的服务器端使用mysql。我每天都这样做,它可以在5秒内用mysql查询。

可能是你的where子句正在创建全表扫描,因此超时回到Diagflow(> 5秒)或数据库连接失败。

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

祝你好运。