Есть ли способ заставить Node.JS выполнить мои функции MySQL перед тем, как он выполнит мою функцию вывода Dialogflow? - PullRequest
0 голосов
/ 21 июня 2019

Я настраиваю чат-бота Dialogflow, который подключается к локальной базе данных MySQL, и он выполняет оператор, который должен видеть пользователь, прежде чем он извлечет информацию, необходимую для его заполнения, и я не уверен, как решить эту проблему.

Я попытался создать цикл, который бы принудительно выполнял операторы извлечения данных MySQL, но это не сработало.Я попытался просто выполнить компоненты agent.add () в компоненте MySQL, но по какой-то причине они не будут выполняться / отображаться в 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)

Ожидаемый результат будет:

Привет имя!

Но вна самом деле вывод:

Здравствуйте, undefined!

Я подтвердил, что он действительно получает информацию через консоль, когда я прошу его вывести имя в функцию чтения MySQL и подтверждает, что он читаетэто не последовательно, как будет показано:

Здравствуйте, undefined!имя имя

Вместо:

имя имя Привет, имя!

1 Ответ

2 голосов
/ 21 июня 2019

Сначала верните обещание из вашей базы данных:

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 + "!");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...