我正在使用Oracle聊天机器人和Google Home,并且正在Google上构建一个应用程序,该应用程序的数据由Oracle机器人处理。但是我发现两者之间的通信存在问题。他们通过webhook进行通讯,我有一个应用程序可以接收用户输入并将其发送到聊天机器人,但是聊天机器人以异步方式发送回覆,并且我无法在POST请求中获取回覆数据并显示它给用户,因此我必须向用户发送媒体响应,以等待bot的回复,并在调用另一个操作以检查回复是否准备好之后。
我想同步获取回复,或者至少不必发送媒体响应来等待机器人回复。有可能吗?
我必须使用Oracle聊天机器人和Google Home。
此问题包含我的代码: How to make asynchronous calls from external services to actions on google?
编辑:
/text
端点将用户输入发送到我的聊天机器人
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){
return textFound(conv, input, userId);
}else{
textnotFound(conv);
}
});
express_app.post('/text', app);
聊天机器人将回复发送到另一个端点:
express_app.post('/webhook', bodyParser.json(), (req, res)=>{
message = req.body;
const userId = req.body.userId;
if (!userId) {
return res.status(400).send('Missing User ID');
}
if (webhook.verifyMessageFromBot(req.get('X-Hub-Signature'), req.body, metadata.channelSecretKey)) {
console.log("todo bien");
res.sendStatus(200);
} else {
console.log("Todo mal");
res.sendStatus(403);
}
});
从这里开始,我无法将数据发送回Google行动,我必须将数据保存在队列中,然后在再次调用TEXT行为以检查队列之后。如果可能的话,我想在回覆初始请求中得到答复,或者寻求另一种解决方法来解决此问题。
答案 0 :(得分:2)
如果您的Webhook在5秒内响应,则可以内联完成整个设置。如果您的Action是使用Node.js编写的,则可以使用Promises插入异步代码。下面是一个示例片段。
function getBotResponse() {
return new Promise((resolve, reject) => {
// Call bot
resolve(botResponse);
})
}
app.intent('get oracle bot', conv => {
return getBotResponse()
.then((botResponse) => {
conv.ask(botResponse)
});
})
答案 1 :(得分:0)
我用node的pub-sub库解决了这个问题。当应用收到来自GH用户的消息时,请使用其ID订阅一个将处理机器人响应isWrapped=false
的函数。
当应用在另一个端点接收到来自bot的响应时,该应用将消息发布在user_id主题CATextLayer.fontSize
中,该消息由commandResponse函数处理并发送给GH。
此功能内置于GH动作端点中的Promise中。