有没有办法让 Node.JS 在执行我的 Dialogflow 输出函数之前先执行我的 MySQL 函数?

Is there a way to get Node.JS to execute my MySQL functions first before it executes my Dialogflow output function?

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

我试图创建一个循环来强制执行 MySQL 数据检索语句,但没有成功。我试图只在 MySQL 组件中执行 agent.add() 组件,但由于某种原因,不会在 Dialogflow 上执行 execute/display。我曾尝试使用 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 读取函数中输入名称,并且它确认它是非顺序读取的,因为它将显示:

您好未定义! 姓名 名字

而不是:

名字 姓名 你好名字!

首先,return 来自您的数据库函数的承诺:

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 + "!");
}