Интеграция Amazon Lex и BotFramework TypeError: не удается выполнить «получение» на прокси-сервере, который был отозван в ответе

Я делал пробную версию, пытаясь интегрировать BotFramework с Amazon lex и, наконец, интегрировать бота в канал групп 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, и когда я пытаюсь вернуть тот же ответ, context.sendActivity (MessageFactory.text (msg)) в функции обратного вызова для BotFramework выдает ошибку

Blockquote TypeError: Невозможно выполнить «получение» на прокси-сервере, который был отозван при ответе. (E: \ игровая площадка \ BotBuilder-Samples \ samples \ javascript_nodejs \ 02.echo-bot \ lexbot.js: 93: 25) по запросу. (E: \ игровая площадка \ BotBuilder-Samples \ samples \ javascript_nodejs \ 02.echo-bot \ node_modules \ aws-sdk \ lib \ request.js: 369: 18) в Request.callListeners (E: \ игровая площадка \ BotBuilder-Samples \ образцы \ javascript_nodejs \ 02.echo-bot \ node_modules \ aws-sdk \ lib \ sequence_executor.js: 106: 20) в Request.emit (E: \ игровая площадка \ BotBuilder-Samples \ samples \ javascript_nodejs \ 02.echo-bot \ node_modules \ aws-sdk \ lib \ sequence_executor.js: 78: 10)

Похоже, что после отправки сообщения Лексу прокси, который использует бот, больше не доступен. Не могли бы вы подсказать, как это исправить?

Это вызывающий код, вызывающий асинхронную функцию 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();
        });
    }

person user2714010    schedule 28.08.2020    source источник
comment
Привет, Кайл, большое спасибо за помощь, каково было решение вопроса stackoverflow.com/questions/53054736/bot-framework-async-issues. Это похоже на проблему, с которой я столкнулся.   -  person user2714010    schedule 31.08.2020
comment
Приемлем ли мой ответ?   -  person Kyle Delaney    schedule 01.09.2020
comment
Спасибо, Кайл, это было идеально   -  person user2714010    schedule 02.09.2020


Ответы (1)


Это сообщение об ошибке всегда означает, что вы не ждали чего-то, чего следует ждать. Вы можете увидеть в своем конструкторе следующую строку:

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, но он ничего не делает, потому что _ 6_ возвращает запрос, а не обещание. И вы, возможно, заметили, что вы не можете ничего ожидать в обратном вызове, потому что это не асинхронная функция. Кажется, что пакет Lex основан на обратных вызовах, а не на обещаниях, что означает, что его сложно использовать с Bot Framework, поскольку SDK Bot Builder основан на обещаниях.

Вы можете вызвать PostText API напрямую, используя обещание. основанная на HTTP-библиотека, такая как Axios: использовать ожидание внутри обратный вызов (Microsoft Bot Framework v4 nodejs)

В качестве альтернативы вы можете попробовать создать собственное обещание, а затем ожидая этого: Bot Framework V4 - TypeError: не удается выполнить команду" get "на отозванном прокси-сервере

person Kyle Delaney    schedule 31.08.2020