Asynchronous 如何从外部服务对google上的操作进行异步调用?

Asynchronous 如何从外部服务对google上的操作进行异步调用?,asynchronous,actions-on-google,chatbot,google-home,Asynchronous,Actions On Google,Chatbot,Google Home,我正在尝试使用actionssdk将Google Home连接到外部聊天机器人。我有一个API,它接收用户输入并通过webhook将它们发送到我的聊天机器人,但是我的聊天机器人以异步方式调用我的API的另一个端点进行响应,并且我无法在Google或Google Home上的操作中显示响应 我创建了一个actionssdkApp const { actionssdk, SimpleResponse, Image, } = require('actions-on-google'); va

我正在尝试使用actionssdk将Google Home连接到外部聊天机器人。我有一个API,它接收用户输入并通过webhook将它们发送到我的聊天机器人,但是我的聊天机器人以异步方式调用我的API的另一个端点进行响应,并且我无法在Google或Google Home上的操作中显示响应

我创建了一个actionssdkApp

const {
  actionssdk,
  SimpleResponse,
  Image,
} = require('actions-on-google');
var app = actionssdk();
var express_app = express();
我的API有两个端点。其中之一是google上的操作将用户输入发送到我的聊天机器人:

app.intent('actions.intent.MAIN', conv => {
  console.log('entra en main');
  conv.ask('Hi, how is it going?');
});

app.intent('actions.intent.TEXT', (conv, input) => {
  var userId = conv.body.user.userId;
  console.log(userId);

  if(userId && input){
    textFound(conv, input, userId);
  }else{
    textnotFound(conv);
  }
});
TextFound函数使用webhook将用户输入发送到我的聊天机器人,但请求未收到响应。My chatbot使用文本应答调用另一个端点:

express_app.post('/webhook', bodyParser.json(), (req, res)=>{
  console.log("Webhook");
  const userId = req.body.userId;
  if (!userId) {
    return res.status(400).send('Missing User ID');
  }
  console.log(req.body);
  res.sendStatus(200);
});
这里是我想把答案发送到谷歌主页的地方。但我需要conv对象在googlehome、google或任何其他设备上显示答案

编辑:

我的
textFound
功能:

webhook.messageToBot(metadata.channelUrl, metadata.channelSecretKey, userId, input, function(err){
        if(err){
            console.log('Error in sending message');
            conv.ask("Error in sending message");
        }else{
            conv.ask("some text");
        }
    });
request.post({
    uri: channelUrl,
    headers: headers,
    body: body,
    timeout: 60000,
    followAllRedirects: true,
    followOriginalHttpMethod: true,
    callback: function(err, res, body) {
        if (err) {                    
            console.log('err: '+err);
            callback(err);
        } else {
            console.log('Message sent');
            callback(null);
        }
    }
}); 
从这里,我的api通过
messageToBot
函数向我的bot发送用户输入:

webhook.messageToBot(metadata.channelUrl, metadata.channelSecretKey, userId, input, function(err){
        if(err){
            console.log('Error in sending message');
            conv.ask("Error in sending message");
        }else{
            conv.ask("some text");
        }
    });
request.post({
    uri: channelUrl,
    headers: headers,
    body: body,
    timeout: 60000,
    followAllRedirects: true,
    followOriginalHttpMethod: true,
    callback: function(err, res, body) {
        if (err) {                    
            console.log('err: '+err);
            callback(err);
        } else {
            console.log('Message sent');
            callback(null);
        }
    }
}); 

从现在起,我的bot不会发送响应,而是用响应调用我的api的
/webhook
端点。但在这个函数中,我没有de conv对象,也无法将答案发送到google。我不知道如何访问这个对象。也许有一个uri可以从我的api连接到谷歌上的actions中的我的项目

通常,Google上的操作以请求-响应的方式工作。用户对该操作说了些什么,该操作会给出一个响应。这个答复需要在大约5秒钟内作出。如果您认为对/webhook的调用可以这么快到达,并且只有在用户说了什么之后,您才会向用户发送消息,那么您可以让/webhook将响应保存在一个队列中供用户使用,并让您的意图处理程序处于一个循环中,该循环检查该队列中是否有任何要回复的消息-如果在5秒内有消息,你用它回复,如果没有,你需要在5秒之前回复

如果你不能保证它能在5秒内完成,那么根据你的需要,有一些变通方法可能会很有用

首先,您可能能够使用。在这种情况下,您将从用户发送消息,然后关闭对话。当您的/webhook endpiont被触发时,您将找到用户并将通知发送给他们的助手。不幸的是,这是一个有点笨重,不导致一个非常互动的聊天系统,通知也不支持智能扬声器


您还可以研究使用设置定期轮询新消息的方法。在此方案下,您的用户将发送他们的消息。在您对他们的回复中,您将包括媒体对某些音频的响应,例如播放15秒。音频结束后,将再次调用您的操作,您可以检查是否有任何消息排队等待发送给用户。如果是这样,您将转发这些消息,然后是媒体响应增益。否则,只需发送媒体响应即可。您对/webhook的调用必须将消息放入队列中才能传递给用户。这更复杂,尤其是在规模上,但可以使其更具交互性。这也是一种更普遍的情况,即尝试在5秒内以循环方式处理它。

因此,如果我理解正确,您希望从actions.intent.text向web服务发出POST请求吗?然后,此web服务将返回一个响应,该响应将从您的操作中发送?查看
textFound
功能会很有用。我编辑了这篇文章,请查看。web服务是一个聊天机器人。我从actions.intent.text发出了一个POST请求,我的聊天机器人没有做出响应,而是用答案调用
/webhook
端点,我不知道如何将此答案发送到我在谷歌上的actions项目。感谢您的评论。我正在尝试解决此问题,我想问您是否有办法延迟以等待消息重播,或者我需要实施媒体响应解决方案。谢谢。我已经更新了我的答案来澄清。如果您知道回复将在五秒钟内完成,那么您当然可以在处理程序中循环并查找它。但是,通过媒体响应工作区这样做将在更一般的情况下处理它。