Integration von Amazon Lex und BotFramework TypeError: Auf einem Proxy, der bei Response [duplicate] widerrufen wurde, kann 'get' nicht ausgeführt werden.

Aug 28 2020

Ich habe einen Proof of Concept durchgeführt, um BotFramework in Amazon Lex zu integrieren und den Bot schließlich in den Microsoft-Teamkanal zu integrieren. Mit dem AWS-SDK wird der Amazon Lex-Bot aufgerufen.

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; 
}

Die Antwort von Lex wird empfangen und wenn ich versuche, dieselbe Antwort zurück zu geben context.sendActivity (MessageFactory.text (msg)) in der Rückruffunktion an BotFramework löst einen Fehler aus

Blockquote TypeError: Auf einem Proxy, der bei Response widerrufen wurde, kann 'get' nicht ausgeführt werden. (E: \ playground \ BotBuilder-Samples \ samples \ javascript_nodejs \ 02.echo-bot \ lexbot.js: 93: 25) auf Anfrage. (E: \ playground \ BotBuilder-Samples \ samples \ javascript_nodejs \ 02.echo-bot \ node_modules \ aws-sdk \ lib \ request.js: 369: 18) unter Request.callListeners (E: \ playground \ BotBuilder-Samples \ samples \ javascript_nodejs \ 02.echo-bot \ node_modules \ aws-sdk \ lib \ sequential_executor.js: 106: 20) bei Request.emit (E: \ playground \ BotBuilder-Samples \ samples \ javascript_nodejs \ 02.echo-bot \ node_modules \ aws-sdk \ lib \ sequential_executor.js: 78: 10)

Sobald die Nachricht an Lex gesendet wurde, ist der vom Bot verwendete Proxy anscheinend nicht mehr verfügbar. Können Sie einige Hinweise geben, wie Sie dies beheben können?

Dies ist der aufrufende Code, der die asynchrone Funktion callLex aufruft

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();
        });
    }

Antworten

3 KyleDelaney Aug 31 2020 at 18:49

Diese Fehlermeldung bedeutet immer, dass Sie nicht auf etwas gewartet haben, auf das gewartet werden sollte. Sie können die folgende Zeile in Ihrem Konstruktor sehen:

await context.sendActivity(`Hi, I'm a TutorialBot. Welcome to the team ${ teamMember.givenName } ${ teamMember.surname }`);

Dies sollte für Sie bedeuten, dass sendActivitygewartet werden muss, und dennoch warten Sie in Ihrem postTextRückruf nicht darauf:

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")
})

Sie warten auf den Anruf für sich postTextselbst, aber das bringt nichts, da postTexteine Anfrage und kein Versprechen zurückgegeben wird. Und Sie haben vielleicht bemerkt, dass Sie im Rückruf nichts erwarten können, da es sich nicht um eine asynchrone Funktion handelt. Es scheint, dass das Lex-Paket auf Rückrufen und nicht auf Versprechungen basiert, was bedeutet, dass es schwierig ist, es mit dem Bot Framework zu verwenden, da das Bot Builder SDK auf Versprechungen basiert.

Möglicherweise möchten Sie die PostText-API direkt über eine auf Versprechen basierende HTTP-Bibliothek wie Axios aufrufen : Verwenden Sie wait innerhalb des Rückrufs (Microsoft Bot Framework v4 nodejs).

Alternativ können Sie versuchen , Ihr eigenes Versprechen zu erstellen und dann darauf zu warten: Bot Framework V4 - TypeError: Auf einem widerrufenen Proxy kann kein 'get' ausgeführt werden