节点回调 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
})
我创建了一个意图,根据他作为参数提供的 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
})