【问题标题】:Is there a way to get Node.JS to execute my MySQL functions first before it executes my Dialogflow output function?有没有办法让 Node.JS 在执行我的 Dialogflow 输出函数之前先执行我的 MySQL 函数?
【发布时间】:2019-06-21 23:18:44
【问题描述】:

我正在设置一个连接到本地 MySQL 数据库的 Dialogflow 聊天机器人,它会执行用户应该看到的语句,然后再提取填充它所需的信息,我不知道如何解决这个问题。

我试图创建一个循环来强制执行 MySQL 数据检索语句,但没有成功。我试图只在 MySQL 组件中执行 agent.add() 组件,但由于某种原因不会在 Dialogflow 上执行/显示。我曾尝试使用 Node.JS 异步指令,但我的代码只会变砖。

const express = require('express')
const { WebhookClient } = require('dialogflow-fulfillment')
const app = express()
const mysql = require('mysql');
const connection = mysql.createConnection({
    host: 'localhost',
    user: '',
    password: '',
    database: '',
    port: '3306'
});

var someVar;
app.get('/', (req, res) => res.send('online'))
app.post('/dialogflow', express.json(), (req, res) => {
    const agent = new WebhookClient({ request: req, response: res })

    function setValue(value) {
        someVar = value;
        console.log(someVar);
    }

    function database(mnumber) {
        connection.query('SELECT name FROM data WHERE mnum = ' +    connection.escape(mnumber), function(err, rows){
            if(err) {
                throw err;
            } else {
                setValue(rows[0].name);
                console.log(String(someVar));
            }
        });
    }

    function welcome () {
        agent.add('Welcome to my agent! Is it working?')
    }

    function userinfo () {
        const mnumber = agent.parameters.mnumber;
        database(mnumber);
        var testVar = String(someVar);
        agent.add("Hello " + testVar + "!");
        console.log("Hello " + testVar + "!");
    }

    let intentMap = new Map()
    intentMap.set('Default Welcome Intent', welcome)
    intentMap.set('userInformation', userinfo)
    agent.handleRequest(intentMap)
})

app.listen(process.env.PORT || 8080)

预期的输出是:

你好名字!

但实际上输出是:

你好未定义!

我确认它实际上是通过控制台获取信息,因为我要求它在 MySQL 读取函数中输入名称,并确认它以非顺序读取它,因为它会显示:

你好未定义! 姓名 名字

而不是:

名称 姓名 你好名字!

【问题讨论】:

标签: javascript mysql node.js dialogflow-es


【解决方案1】:

首先,从您的数据库函数返回一个承诺:

function database(mnumber) {
    return new Promise((resolve, reject)=>{
        connection.query('SELECT name FROM data WHERE mnum = '+connection.escape(mnumber), function(err, rows){
            if(err) {
                reject(err);
            } else {
                setValue(rows[0].name);
                console.log(String(someVar));
                resolve();
            }
        });
    });
}

然后让你的 userinfo 函数异步并让它等待数据库完成后再继续。

async function userinfo () {
    const mnumber = agent.parameters.mnumber;
    await database(mnumber);
    var testVar = String(someVar);
    agent.add("Hello " + testVar + "!");
    console.log("Hello " + testVar + "!");
}

【讨论】:

    猜你喜欢
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多