Использование условных операторов с QnAMaker - операторы неправильно маршрутизируют - PullRequest
0 голосов
/ 17 февраля 2019

Мне трудно понять, что, скорее всего, является простой проблемой, которая связана с проблемой «если тогда еще» в моем коде (NodeJS, Bot Framework v4).

Я не могу совсемвыясните, почему соответствующая карта не отображается в зависимости от количества точек с запятой, которые она находит в строке ответа от QnAMaker.

При тестировании с эмулятором Bot Framework он возвращает только один тип ответа, будь то простой текст или одна Rich Card, независимо от того, сколько точек с запятой в ответе.

У меня естьпопытался определить, является ли это длиной строки, с которой возникают проблемы, путем анализа числового значения в операторе длины.Не имеет значения, к сожалению.В частности, если я использую любой другой условный оператор, например, '===', он полностью нарушает ответ.

 const { ActivityTypes, CardFactory } = require('botbuilder');
 const { WelcomeCard } = require('./dialogs/welcome');
 // const { HeroCard } = require('./dialogs/welcome');
 // const { VideoCard } = require('./dialogs/welcome');

class MyBot {
/**
 *
 * @param {TurnContext} on turn context object.
 */

constructor(qnaServices) {
    this.qnaServices = qnaServices;
}

async onTurn(turnContext) {
    if (turnContext.activity.type === ActivityTypes.Message) {
        for (let i = 0; i < this.qnaServices.length; i++) {
            // Perform a call to the QnA Maker service to retrieve matching Question and Answer pairs.
            const qnaResults = await this.qnaServices[i].getAnswers(turnContext);
            const qnaCard = qnaResults.includes(';');

            // If an answer was received from QnA Maker, send the answer back to the user and exit.
            if (qnaCard.toString().split(';').length < 3) {
                await turnContext.sendActivity(qnaResults[0].answer);
                await turnContext.sendActivity({
                    text: 'Hero Card',
                    attachments: [CardFactory.heroCard(HeroCard)]
                });

            } else if (qnaCard.toString().split(';').length > 3) {
                await turnContext.sendActivity(qnaResults[0].answer);
                await turnContext.sendActivity({
                    text: 'Video Card',
                    attachments: [CardFactory.videoCard(VideoCard)]
                });

            } else if (qnaCard.toString().split(';').length === 0) { 
                    await turnContext.sendActivity(qnaResults[0].answer);
             return;
            }
        }
        // If no answers were returned from QnA Maker, reply with help.
        await turnContext.sendActivity('No QnA Maker answers were found.');
    } else {
        await turnContext.sendActivity(`[${ turnContext.activity.type } event detected]`);
    } if (turnContext.activity.type === ActivityTypes.ConversationUpdate) {
        // Handle ConversationUpdate activity type, which is used to indicates new members add to
        // the conversation.
        // See https://aka.ms/about-bot-activity-message to learn more about the message and other activity types

        // Do we have any new members added to the conversation?
        if (turnContext.activity.membersAdded.length !== 0) {
            // Iterate over all new members added to the conversation
            for (var idx in turnContext.activity.membersAdded) {
                // Greet anyone that was not the target (recipient) of this message
                // the 'bot' is the recipient for events from the channel,
                // context.activity.membersAdded == context.activity.recipient.Id indicates the
                // bot was added to the conversation.
                if (turnContext.activity.membersAdded[idx].id !== turnContext.activity.recipient.id) {
                    // Welcome user.
                    // When activity type is "conversationUpdate" and the member joining the conversation is the bot
                    // we will send our Welcome Adaptive Card.  This will only be sent once, when the Bot joins conversation
                    // To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards for more details.
                    const welcomeCard = CardFactory.adaptiveCard(WelcomeCard);
                    await turnContext.sendActivity({ attachments: [welcomeCard] });
                }
            }
        }
    }
}
}

module.exports.MyBot = MyBot;

В идеале я надеюсь увидеть, если я задам вопрос, который имеет3 точки с запятой в ответе, он выдает карту героя.Если он имеет более 3, то видеокарта и, если нет, текстовый ответ.

1 Ответ

0 голосов
/ 18 февраля 2019

Я не специалист по js, но меня смущает следующее:

const qnaCard = qnaResults.includes(';');

В Javascript includes - это следующее ( source ):

Метод includes () определяет, включает ли массив определенное значение в свои записи, возвращая в зависимости от ситуации true или false.

Так что здесь ваш qnaCard равен true или false.Но похоже, что вы пытаетесь использовать его так, как если бы он содержал текст:

if (qnaCard.toString().split(';').length < 3) {
    ...

Вы должны работать с объектом, содержащим ответ: qnaResults[0].answer.

...