对话流中的 Bigquery ML node.js
Bigquery ML in dialogflow with node.js
我是 javascript 的菜鸟。我不明白 dialogflow 中 promises 的语法。
我试图让工作变得简单 BigQuery 调用,但没有成功。
它 return 在控制台中的某个时刻是正确的信息,但在流程中不是
示例最初来自本教程“https://codelabs.developers.google.com/codelabs/cloud-dialogflow-bqml/index.html?index=..%2F..cloudai#4”。我更改了一些代码,因为我想让它与 "app.intent" 一起工作:exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app)
而不是“agent.handleRequest(intentMap)
”
我试过使用return new Promise((resolve,reject) => {
和resolve
。我在 Whosebug 上花了几个小时尝试了几种代码组合,但 none 成功了。
const ticketCollection=(conv,EMAIL,CATEGORY) => {
// The SQL Query to Run
const SQLQUERY = `WITH pred_table AS (SELECT 5 as seniority, "3-Advanced" as experience,
"${CATEGORY}" as category, "Request" as type)
SELECT cast(predicted_label as INT64) as predicted_label
FROM ML.PREDICT(MODEL helpdesk.predict_eta, TABLE pred_table)`;
const OPTIONS = {
query: SQLQUERY,
// Location must match that of the dataset(s) referenced in the query.
location: "US",
params: {
category: CATEGORY
}
};
console.log("options",OPTIONS);
return new Promise((resolve,reject) => {
BIGQUERY_CLIENT.query(OPTIONS)
.then(results => {
//Capture results from the Query
console.log(JSON.stringify(results[0]));
const QUERY_RESULT = results[0];
const ETA_PREDICTION = QUERY_RESULT[0].predicted_label;
console.log("results",QUERY_RESULT);
console.log("eta",ETA_PREDICTION);
resolve();
reply(conv,`Thanks a lot, we will get back to you in ${ETA_PREDICTION} minutes`);
});
});
};
app.intent('Submit Ticket', (conv) => {
console.log("Parameters", conv.parameters);
const EMAIL = conv.parameters.email;
const CATEGORY = conv.parameters.category;
ticketCollection(conv,EMAIL,CATEGORY);
});
我希望聊天机器人 return 达到预期的时间。同样,我是 javascript 的菜鸟。任何建议或意见将不胜感激!非常感谢您!
有很多事情可能会导致您的问题。没有看到所有的代码,很难确定,但这里有几个问题:
Promises 和 Intent 处理程序
您使用
创建的 Intent Handler
app.intent('Submit Ticket', (conv) => {
需要 return 一个 Promise,因为您正在其中某处执行异步操作。库需要知道什么时候所有的工作都完成了,响应消息已经设置好了,它可以实际return响应给用户。
由于 ticketCollection()
return 是 Promise,最简单的方法就是将调用更改为
return ticketCollection(conv,EMAIL,CATEGORY);
承诺与解决()
下一个问题是你在做进一步工作之前调用 resolve()
(调用 reply()
,不管它是什么):
resolve();
reply(conv,`Thanks a lot, we will get back to you in ${ETA_PREDICTION} minutes`);
如上所述,当 Promise 解析时,库假设所有事情都已完成,但看起来您正在尝试设置回复 after 您调用 resolve()
.
在这种情况下,交换两条线就可以解决这个问题。但可能有更好的解决方案。
使用为您提供的承诺
整个代码块看起来相当复杂,并且可能可以以一种有意义的方式进行简化,因为 BIGQUERY_CLIENT.query(OPTIONS)
return 是一个 Promise(如 then()
块所建议的那样。所以你可以只 return 它创建的 Promise 而不是必须将它包装在你自己的中。(对于没有 return 它们自己的 Promise 的库,你可能仍然需要包装它,但是越来越多的人 return 使用 Promises,因为它是一个更好的解决方案。)
所以您可以通过删除整个 new Promise
部分和对 resolve()
的调用来简化它,它可能看起来像
console.log("options",OPTIONS);
return BIGQUERY_CLIENT.query(OPTIONS)
.then(results => {
//Capture results from the Query
console.log(JSON.stringify(results[0]));
const QUERY_RESULT = results[0];
const ETA_PREDICTION = QUERY_RESULT[0].predicted_label;
console.log("results",QUERY_RESULT);
console.log("eta",ETA_PREDICTION);
reply(conv,`Thanks a lot, we will get back to you in ${ETA_PREDICTION} minutes`);
});
您仍然需要确保 return Promise,并确保它 returned 到处理程序库,但这比尝试包装东西更容易阅读代码。
我是 javascript 的菜鸟。我不明白 dialogflow 中 promises 的语法。
我试图让工作变得简单 BigQuery 调用,但没有成功。
它 return 在控制台中的某个时刻是正确的信息,但在流程中不是
示例最初来自本教程“https://codelabs.developers.google.com/codelabs/cloud-dialogflow-bqml/index.html?index=..%2F..cloudai#4”。我更改了一些代码,因为我想让它与 "app.intent" 一起工作:exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app)
而不是“agent.handleRequest(intentMap)
”
我试过使用return new Promise((resolve,reject) => {
和resolve
。我在 Whosebug 上花了几个小时尝试了几种代码组合,但 none 成功了。
const ticketCollection=(conv,EMAIL,CATEGORY) => {
// The SQL Query to Run
const SQLQUERY = `WITH pred_table AS (SELECT 5 as seniority, "3-Advanced" as experience,
"${CATEGORY}" as category, "Request" as type)
SELECT cast(predicted_label as INT64) as predicted_label
FROM ML.PREDICT(MODEL helpdesk.predict_eta, TABLE pred_table)`;
const OPTIONS = {
query: SQLQUERY,
// Location must match that of the dataset(s) referenced in the query.
location: "US",
params: {
category: CATEGORY
}
};
console.log("options",OPTIONS);
return new Promise((resolve,reject) => {
BIGQUERY_CLIENT.query(OPTIONS)
.then(results => {
//Capture results from the Query
console.log(JSON.stringify(results[0]));
const QUERY_RESULT = results[0];
const ETA_PREDICTION = QUERY_RESULT[0].predicted_label;
console.log("results",QUERY_RESULT);
console.log("eta",ETA_PREDICTION);
resolve();
reply(conv,`Thanks a lot, we will get back to you in ${ETA_PREDICTION} minutes`);
});
});
};
app.intent('Submit Ticket', (conv) => {
console.log("Parameters", conv.parameters);
const EMAIL = conv.parameters.email;
const CATEGORY = conv.parameters.category;
ticketCollection(conv,EMAIL,CATEGORY);
});
我希望聊天机器人 return 达到预期的时间。同样,我是 javascript 的菜鸟。任何建议或意见将不胜感激!非常感谢您!
有很多事情可能会导致您的问题。没有看到所有的代码,很难确定,但这里有几个问题:
Promises 和 Intent 处理程序
您使用
创建的 Intent Handlerapp.intent('Submit Ticket', (conv) => {
需要 return 一个 Promise,因为您正在其中某处执行异步操作。库需要知道什么时候所有的工作都完成了,响应消息已经设置好了,它可以实际return响应给用户。
由于 ticketCollection()
return 是 Promise,最简单的方法就是将调用更改为
return ticketCollection(conv,EMAIL,CATEGORY);
承诺与解决()
下一个问题是你在做进一步工作之前调用 resolve()
(调用 reply()
,不管它是什么):
resolve();
reply(conv,`Thanks a lot, we will get back to you in ${ETA_PREDICTION} minutes`);
如上所述,当 Promise 解析时,库假设所有事情都已完成,但看起来您正在尝试设置回复 after 您调用 resolve()
.
在这种情况下,交换两条线就可以解决这个问题。但可能有更好的解决方案。
使用为您提供的承诺
整个代码块看起来相当复杂,并且可能可以以一种有意义的方式进行简化,因为 BIGQUERY_CLIENT.query(OPTIONS)
return 是一个 Promise(如 then()
块所建议的那样。所以你可以只 return 它创建的 Promise 而不是必须将它包装在你自己的中。(对于没有 return 它们自己的 Promise 的库,你可能仍然需要包装它,但是越来越多的人 return 使用 Promises,因为它是一个更好的解决方案。)
所以您可以通过删除整个 new Promise
部分和对 resolve()
的调用来简化它,它可能看起来像
console.log("options",OPTIONS);
return BIGQUERY_CLIENT.query(OPTIONS)
.then(results => {
//Capture results from the Query
console.log(JSON.stringify(results[0]));
const QUERY_RESULT = results[0];
const ETA_PREDICTION = QUERY_RESULT[0].predicted_label;
console.log("results",QUERY_RESULT);
console.log("eta",ETA_PREDICTION);
reply(conv,`Thanks a lot, we will get back to you in ${ETA_PREDICTION} minutes`);
});
您仍然需要确保 return Promise,并确保它 returned 到处理程序库,但这比尝试包装东西更容易阅读代码。