我有一些意图需要触发履行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。现在谷歌主页不会超时,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)
}
);
});
}
您不能异步触发履行。在会话模型中,预期履行将执行一些确定响应的逻辑。
但是,可以在实现中执行异步操作,该操作在返回结果之前不会完成。
如果您使用的是一个足够现代的node版本(版本8及更高版本),您可以通过将函数声明为async
函数来实现这一点,但而不是使用await
关键字调用它。(如果您确实使用await
调用它,它将等待异步操作完成后再继续。)
举个例子:
async function doSomethingLong(){
// This takes 20 seconds
}
fdk.handle(function (input) {
doSomethingLong();
return {'fulfillmentText': 'This might respond before doSomethingLong finishes.'}
});
根据您的代码示例更新1。
你报告对request
的调用似乎根本没有完成,这似乎很奇怪,但可能是一些奇怪的事情导致了这种情况。
首先,request
本身不是一个异步函数。它使用的是回调模型,async
函数不会自动等待这些回调被调用。因此,callFlow()
函数会多次调用console.log()
,调用request()
并在回调之前返回。
您可能应该将request
替换为类似请求-承诺本机包的东西,并等待您从调用中得到的承诺。这使得callFlow()
真正异步(并且您可以在它完成调用时进行日志记录)。
其次,我要指出,您展示的代码没有执行POST操作。默认情况下,它执行GET。如果您或您正在调用的API期望POST,这可能是错误的来源。然而,我本来希望err
参数被填充,并且您的代码看起来确实像是在检查和记录这一点。
对我来说,整个设置中有一个未知的问题,那就是我不知道fdk
是如何处理异步函数的,我对文档的粗略阅读也没有教会我。我在其他框架中也这样做过,这不是问题,但我不知道一旦fdk
处理程序发送回复,它是否会超时或做其他事情来终止调用。