节点回调 returns mysql 结果,但我无法通过对话流的 google 上的操作打印给用户

Node callback returns mysql result but i cant print to the user with actions on google for dialogflow

我创建了一个意图,根据他作为参数提供的 ID 获取用户信息。使用 mysql 模块我可以处理查询并获得结果。通过回调,我可以将结果传递给主函数,但是一旦我传递给 conv.ask(),代理就会忽略。我究竟做错了什么?

这是我的第一个 node.js 脚本。我尝试在变量中声明 pesquisar_aluno() 这样我就可以在主函数中使用但它返回 null.

const express = require('express');
const bodyParser = require('body-parser')
const mysql = require('mysql')
const {
  dialogflow,
  SignIn,
  SimpleResponse
} = require('actions-on-google')


app.intent('pesquisar.alunos', (conv, params) => {

  const aluno = params.aluno
  conv.ask('Vamos pesquisar')

  pesquisar_aluno(aluno,function(result){
    var resposta = result
    console.log(resposta) // returns the result
    conv.ask(resposta) // ignores it
  })

  console.log(resposta) // returns undefined
})


function pesquisar_aluno(aluno,callback)
{
  var connection = mysql.createConnection({
  host : process.env.MYSQL_HOST,
  user : process.env.MYSQL_USER,
  password : process.env.MYSQL_PASS,
  database : process.env.MYSQL_DB
  })
  connection.connect()

  var query = `SELECT * FROM aluno WHERE id_aluno = "${aluno}"`

  connection.query(query, function (error, results, fields) 
  {
    if(error) throw error

    var usuario = `RA =>${results[0].id_aluno} Nome => ${results[0].nome}`
    if(callback) return callback(usuario)
  })
}

预期 conv.ask(resposta) 将结果打印给用户,但它不打印任何东西

编辑:更改为承诺。成功了!感谢 Nick Felker 和 Prisoner

app.intent('pesquisar.alunos', (conv, params) => {

  const aluno = params.aluno
  conv.ask('Vamos pesquisar')

  let nome = pesquisar_aluno_promise(aluno).then(function(results) {
    return results[0].nome
  }).catch((err) => setImmediate(() => { throw err; }))

  return nome.then(function(result){
    conv.ask(result) 
  })
})

async function pesquisar_aluno_promise(aluno)
{
  return new Promise(function (resolve,reject) {
    var connection = mysql.createConnection({
    host : process.env.MYSQL_HOST,
    user : process.env.MYSQL_USER,
    password : process.env.MYSQL_PASS,
    database : process.env.MYSQL_DB
    })
    connection.connect()

    var query = `SELECT * FROM aluno WHERE id_aluno = "${aluno}"`
    connection.query(query, function (error, results, fields) 
    {
      if (error) {
        return reject(error)
      }
      resolve(results)
    })
  })
}

正如 Nick 在评论中建议的那样,您在进行异步操作时需要使用 Promises。

然而,此外,您需要 return 来自 Intent Handler 的 Promise,以便 Intent Dispatcher 知道在继续之前等待结果。

在你的情况下,这可以只是添加 return,所以它可能看起来像这样:

  return nome.then(function(result){
    console.log(result) //works
    conv.ask(result) //should work now
  })