Microsoft ботов для команд, использующих nodejs, не удается с отсутствующим идентификатором активности при обновлении того же действия - PullRequest
0 голосов
/ 04 февраля 2020

Мой код имеет простую карточную карусель с кнопкой действия, как показано ниже:


 actions = [
        {
            "type": "Action.Submit",
            "title": "Qualify",
            "data": { "action" : "qualify_lead" }
        },
        {
            "type": "Action.OpenUrl",
            "title": "Retire",
            "url": "{viewUrl}"
        },
        {
            "type": "Action.ShowCard",
            "title": "Add Note",
            "card":   this.noteCard(item.LeadId, "leads")
        }
       ]

У меня есть метод для обработки действия qualify_lead, как показано ниже

async qualifyLead(context:any){
        console.log("in qualifyLead:" + JSON.stringify(context.activity))
        await context.updateActivity(this.successCard('Lead is qualified'))
    }

Все, что я делаю специально заменить всю карусель простым текстовым сообщением. Но происходит сбой с ошибкой:

Ошибка: BotFrameworkAdapter.updateActivity (): отсутствует activity.id

Где я могу получить это?

Я использую Google Firebase для этого и код обёртки как показано ниже

const {
    TurnContext,
    TeamsActivityHandler,
    CardFactory,
    AttachmentLayoutTypes,
    ActionTypes
} = require('botbuilder');

class TeamsConversationBot extends TeamsActivityHandler {
    constructor() {
        super();
        this.leadState = 
          this.conversationState.createProperty('leadCarouselState');

        this.onMessage(async (context:any, next:any) => {
            TurnContext.removeRecipientMention(context.activity);
            let msg = context.activity.text
            const action = context.activity.value
            let objNum = ''
            let keyword = ''


            if(msg === undefined && action === undefined)
                msg  = 'help'
            else if(msg !== undefined){
                msg = msg.trim().toLowerCase()
                if(msg.indexOf("help") > -1)
                    msg = 'help'
                else{

                   if(msg.startsWith('lead')){

                        msg = 'lead'
                    } 
                }
            }

            switch (msg) {
                case 'lead':
                        await this.lead(context, userKey, platform)
                        break;
                case 'qualify_lead':
                        await this.qualifyLead(context)
                        break;
            }
            await next();
        });
    }

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Как я объяснил в моем ответе на другой вопрос , вам нужно сохранить идентификатор активности в состоянии бота и затем применить его к отправляемому обновлению. Bot Framework не может обновить действие, если вы не укажете ему, какое действие обновлять, и вы сделаете это, используя идентификатор действия.

Это была часть, которая сохраняет идентификатор:

const dict = await this.carouselState.get(turnContext, {});

dict[batchId] = {
    [KEYACTIVITYID]: response.id,
    [KEYLEADS]: leads
};

И именно эта часть применяет его к обновленной активности:

            const update = this.createCarousel(batchId, leads);
            update.id = info[KEYACTIVITYID];
0 голосов
/ 04 февраля 2020

Я не уверен, что именно делает this.successCard('Lead is qualified'), но, вероятно, он возвращает активность. Насколько мне известно, для того, чтобы эта активность сменила другую, вам нужно установить ее свойство Id в соответствии с предыдущим сообщением. Это означает, что когда вы отправляете предыдущее сообщение (то есть карточку), вам нужно захватить ссылку, возвращенную методом send в контексте (например, в состояние бота), а затем использовать ее для этого нового действия.

...