如何解决Amazon Lex和BotFramework集成TypeError:无法对已在响应中撤销的代理执行“获取”
我正在做一个概念验证,试图将BotFramework与Amazon lex集成在一起,最后将bot集成到Microsoft团队渠道中。 AWS-SDK用于调用Amazon Lex机器人。
async callLex(context) {
let msg
var lexruntime = new AWS.LexRuntime();
const params = {
botAlias: 'tutorialbot',botName: 'TutorialBot',inputText: context.activity.text.trim(),/* required */
userId: context.activity.from.id,//inputStream: context.activity.text.trim()
}
await lexruntime.postText(params,function(err,data) {
console.log("Inside the postText Method")
if (err) console.log(err,err.stack); // an error occurred
else {
console.log(data)
msg = data.message
console.log("This is the message from Amazon Lex" + msg)
context.sendActivity(MessageFactory.text(msg));
//turnContext.sendActivity(msg);
}
console.log("Completed the postText Method")
})
return msg;
}
接收到来自Lex的响应,当我尝试将相同的响应返回给BotFramework的回调函数中的context.sendActivity(MessageFactory.text(msg))时抛出错误
Blockquote TypeError:无法对已被撤销的代理执行“获取” 在回应。 (E:\ playground \ BotBuilder-Samples \ samples \ javascript_nodejs \ 02.echo-bot \ lexbot.js:93:25) 应要求。 (E:\ playground \ BotBuilder-Samples \ samples \ javascript_nodejs \ 02.echo-bot \ node_modules \ aws-sdk \ lib \ request.js:369:18) 在Request.callListeners(E:\ playground \ BotBuilder-Samples \ samples \ javascript_nodejs \ 02.echo-bot \ node_modules \ aws-sdk \ lib \ sequential_executor.js:106:20) 在Request.emit(E:\ playground \ BotBuilder-Samples \ samples \ javascript_nodejs \ 02.echo-bot \ node_modules \ aws-sdk \ lib \ sequential_executor.js:78:10)
似乎消息一旦发送到Lex,该机器人使用的代理就不再可用。您能否提供一些有关如何解决此问题的指导。
class TeamsConversationBot extends TeamsActivityHandler {
constructor() {
super();
this.onMessage(async (context,next) => {
TurnContext.removeRecipientMention(context.activity);
var replyText = `Echo: ${ context.activity.text }`;
await this.callLex(context)
console.log("After calling the callLex Method")
await next();
});
this.onMembersAddedActivity(async (context,next) => {
context.activity.membersAdded.forEach(async (teamMember) => {
if (teamMember.id !== context.activity.recipient.id) {
await context.sendActivity(`Hi,I'm a TutorialBot. Welcome to the team ${ teamMember.givenname } ${ teamMember.surname }`);
}
});
await next();
});
}
解决方法
此错误消息始终表示您尚未等待应等待的内容。您可以在构造函数中看到以下行:
await context.sendActivity(`Hi,I'm a TutorialBot. Welcome to the team ${ teamMember.givenName } ${ teamMember.surname }`);
这应该向您暗示sendActivity
需要等待,但您没有在postText
回调中等待它:
await lexruntime.postText(params,function(err,data) { console.log("Inside the postText Method") if (err) console.log(err,err.stack); // an error occurred else { console.log(data) msg = data.message console.log("This is the message from Amazon Lex" + msg) context.sendActivity(MessageFactory.text(msg)); //turnContext.sendActivity(msg); } console.log("Completed the postText Method") })
您正在等待对postText
本身的调用,但这无济于事,因为postText
返回一个请求而不是一个Promise。您可能已经注意到,您不能等待回调中的任何内容,因为它不是异步函数。看起来Lex包是基于回调的,而不是基于Promise的,这意味着由于Bot Builder SDK是基于Promise的,因此很难与Bot Framework一起使用。
您可能希望使用基于承诺的HTTP库(例如Axios)直接调用PostText API:use await inside callback (Microsoft Bot Framework v4 nodejs)
或者,您可以尝试creating your own promise,然后等待:Bot Framework V4 - TypeError: Cannot perform 'get' on a proxy that has been revoked
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。