微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Amazon Lex和BotFramework集成TypeError:无法对已在响应中撤销的代理执行“获取”

如何解决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,该机器人使用的代理就不再可用。您能否提供一些有关如何解决此问题的指导。

这是调用异步函数callLex的调用代码

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 APIuse 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 举报,一经查实,本站将立刻删除。