Google Action Webhook 内联编辑器 Returns 在 API 调用之前
Google Action Webhook Inline Editor Returns Before the API call
这是我的第一个 Google 行动计划。调用后我有一个简单的插槽。用户在提示符上输入值,插槽调用 webhook 并使用用户输入调用 API。一切正常。然而,webhook returns 甚至在 API 调用完成处理和 returns 值(第 1 conv.add 行)之前向用户发送。我确实在日志中看到,在 Webhook returns 到用户之后,从 API 开始的所有内容都正常记录。下面是我正在使用的代码。我正在使用内联编辑器。我错过了什么?预先感谢您的帮助。
const { conversation } = require('@assistant/conversation');
const functions = require('firebase-functions');
var https = require('https');
const fetch = require('node-fetch');
const app = conversation({debug: true});
app.handle('SearchData', conv => {
const body = JSON.stringify({
val: "this is my body"
});
// prepare the header
var postheaders = {
'Content-Type' : 'application/json',
'Auth' : 'MyAuthCreds'
};
fetch('https://host.domain.com/data', {
method: 'post',
body: body,
headers: postheaders,
})
.then(res => res.json())
.then(d => {
console.log(d);
var profile = d;//JSON.parse(d);
console.log(d.entries);
console.log("Length: "+ d.entries.length);
if(d.entries.length > 0)
{
console.log("Data found");
conv.add("Data found"); //line 1
}
else
{
console.log("no data found");
conv.add("no data found"); //line 1
}
})
.catch(function (err) {
// POST failed...
console.log(err);
});
});
exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);
您的问题是您的处理程序正在进行 API 异步调用,但 Assistant Conversation 库不知道您正在这样做。因此,一旦处理程序完成,它就会尝试发回响应,但是您的异步响应(then()
块中的内容)尚未执行。
为了解决这个问题,您需要 return 一个 Promise
对象,这样库就知道要等到 Promise 完成后才会 returns。
幸运的是,对于您的情况,这应该非常简单。 fetch
和所有 .then()
块 return 一个 Promise。所以你需要做的就是在调用 fetch
之前添加一个 return
语句。所以像这样:
return fetch('https://host.domain.com/data', {
这是我的第一个 Google 行动计划。调用后我有一个简单的插槽。用户在提示符上输入值,插槽调用 webhook 并使用用户输入调用 API。一切正常。然而,webhook returns 甚至在 API 调用完成处理和 returns 值(第 1 conv.add 行)之前向用户发送。我确实在日志中看到,在 Webhook returns 到用户之后,从 API 开始的所有内容都正常记录。下面是我正在使用的代码。我正在使用内联编辑器。我错过了什么?预先感谢您的帮助。
const { conversation } = require('@assistant/conversation');
const functions = require('firebase-functions');
var https = require('https');
const fetch = require('node-fetch');
const app = conversation({debug: true});
app.handle('SearchData', conv => {
const body = JSON.stringify({
val: "this is my body"
});
// prepare the header
var postheaders = {
'Content-Type' : 'application/json',
'Auth' : 'MyAuthCreds'
};
fetch('https://host.domain.com/data', {
method: 'post',
body: body,
headers: postheaders,
})
.then(res => res.json())
.then(d => {
console.log(d);
var profile = d;//JSON.parse(d);
console.log(d.entries);
console.log("Length: "+ d.entries.length);
if(d.entries.length > 0)
{
console.log("Data found");
conv.add("Data found"); //line 1
}
else
{
console.log("no data found");
conv.add("no data found"); //line 1
}
})
.catch(function (err) {
// POST failed...
console.log(err);
});
});
exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);
您的问题是您的处理程序正在进行 API 异步调用,但 Assistant Conversation 库不知道您正在这样做。因此,一旦处理程序完成,它就会尝试发回响应,但是您的异步响应(then()
块中的内容)尚未执行。
为了解决这个问题,您需要 return 一个 Promise
对象,这样库就知道要等到 Promise 完成后才会 returns。
幸运的是,对于您的情况,这应该非常简单。 fetch
和所有 .then()
块 return 一个 Promise。所以你需要做的就是在调用 fetch
之前添加一个 return
语句。所以像这样:
return fetch('https://host.domain.com/data', {