我有一些意图需要触发履行 webhook 并且不关心响应。webhook 的响应时间比超时时间长,所以我希望简单地回复“感谢聊天”,然后在实际触发 webhook 时关闭对话。
感觉很容易,但我错过了一些东西。我也是对话框流的新手。
我可以用任何语言做到这一点,但这里有一个 Javascript 示例:
fdk.handle(function (input) {
// Some code here that takes 20 seconds.
return {'fulfillmentText': 'i can respond but I will never make it here.'}
});
编辑 1 - 尝试异步
当我使用异步函数时,POST 请求永远不会发生。所以在下面的代码中:
fdk.handle(function (input) {
callFlow(input);
return { 'fulfillmentText': 'here is the response from the webhook!!' }
});
async function callFlow(input) {
console.log("input is --> " + input)
var url = "some_url"
console.log("Requesting " + url)
request(url, { json: true, headers: {'Access-Control-Allow-Origin' : '*'} }, (err, res, body) => {
if (err) { return console.log(err); }
console.log("body is...")
console.log(body)
});
}
我在日志中看到了两个 console.log 输出,但没有从请求中看到。而且该请求似乎也没有发生,因为我在端点上看不到它。
解决方案
感谢囚犯的提示。似乎我需要通过 callFlow() 和 handle() 函数返回履行 JSON。现在 Google Home 不会超时,并且会生成 HTTP 调用和响应。
const fdk = require('@fnproject/fdk');
const request = require('request');
fdk.handle(function (input) {
return callFlow(input);
});
async function callFlow(input) {
var searchPhrase = input || "cats"
var url = "some url"
return new Promise((resolve, reject) => {
request.post(url, {
headers: { 'content-type': 'application/x-www-form-urlencoded' },
body: searchPhrase
},
function (err, resp, body) {
if (err) { return console.log(err) }
r = { 'fulfillmentText': `OK I've triggered the flow function with search term ${searchPhrase}` }
resolve(r)
}
);
});
}