首页 > 解决方案 > 使用 Node-Schedule 启动 BotBuilder 对话框

问题描述

我有一个 BotBuilder 对话框的工作代码。我现在想让对话在每周一至周五上午 8:30 开始,使用如下节点调度。

var rule = new schedule.RecurrenceRule();
// Run the task Mondays-Fridays
rule.dayOfWeek = [0, new schedule.Range(1, 5)];
rule.hour = 8;
rule.minute = 30;

schedule.scheduleJob(rule, beginStatusDialog);

console.log('Schedule initialzed.');

运行此“已初始化的计划”时按预期写入。所以,我已经将我的对话框代码包装在函数 beginStatusDialog 中,如下所示。

function beginStatusDialog() {


// Begin dialog - This is a question bot that uses a waterfall technique to prompt users for input.
const bot = new builder.UniversalBot(connector, [
    function (session) {
        session.send("Welcome to the daily status check " + session.message.user.name + ".");
        builder.Prompts.text(session, "What did you do yesterday?");
    },
    function (session, results) {
        session.dialogData.yesterday = session_yesterday = results.response;
        builder.Prompts.text(session, "What will you do today?");
    },
    function (session, results) {
        session.dialogData.today = session_today = results.response;
        builder.Prompts.text(session, "Are there any obstacles holding you up? Note: An email will be sent with your responses.");
    },
    function (session, results) {
        session.dialogData.obstacles = session_obstacles = results.response;

        session_username = session.message.user.name;

        // Write responses to DB
        executeStatement(session_username, session_yesterday, session_today, session_obstacles);

        //Process request and display details
        session.send(`Daily status details: <br/>Yesterday: ${session.dialogData.yesterday} <br/>Today: ${session.dialogData.today} <br/>Obstacles: ${session.dialogData.obstacles}`);
        session.dialogData = {};
        session.endDialog();

    }
]).set('storage', inMemoryStorage); // Register in-memory storage

}

当我在 botframework-emulator 中运行它时,我收到以下错误:

在此处输入图像描述

将对话框包装在函数中是错误的吗?如果是这样,调度程序调用对话框的正确方法是什么?其他人有这种特殊情况的经验吗?

任何帮助/指针将不胜感激。:)

谢谢你。

编辑:

Gary Liu 的评论让我开始思考。所以我像下面这样实例化了函数的 bot ouside,它不再抛出错误,但它在预定的时间没有做任何事情。

var bot = new builder.UniversalBot(connector).set('storage', inMemoryStorage);

然后我用 bot.dialog 在函数内部启动它——或者至少这是我的意图:

function beginStatusDialog() {
// Begin dialog - This is a question bot that uses a waterfall technique to prompt users for input.
//const bot = new builder.UniversalBot(connector, [
bot.dialog([
    function (session) {
        session.send("Welcome to the daily status check " + session.message.user.name + ".");
        builder.Prompts.text(session, "What did you do yesterday?");

无论如何,我正在进一步研究这一点。

一如既往,任何帮助/指针将不胜感激 - 谢谢。

标签: node.jsbotframeworkmicrosoft-teams

解决方案


我能够通过将调度程序放在conversationUpdate 中来使其工作。按照Recurance Rule Scheduling的示例,我将 scheduleJob 放在一个匿名函数中,然后调用 bot.beginDialog()。beginDialog 创建对话堆栈并开始对话流程。传递 message.address 是必要的,因为它将当前用户信息分配给堆栈。

在我的测试中,我让它每分钟运行一次(请参阅日志时间戳)。

我尝试使用命名函数代替匿名函数来调用 bot.beginDialog() 来创建它 - 调度程序似乎不喜欢这样(至少在启动机器人的上下文中)。它没有反应。

希望有帮助!

var rule = new schedule.RecurrenceRule();
// Run the task Mondays-Fridays
rule.dayOfWeek = [0, new schedule.Range(1, 5)];
rule.hour = 13;
// rule.minute = 08;

// schedule.scheduleJob(rule, beginStatusDialog);

console.log('Schedule initialzed.');

var bot = new builder.UniversalBot(connector);
bot.set('storage', new builder.MemoryBotStorage());

bot.on('conversationUpdate', function (message) {
    if (message.membersAdded) {
        message.membersAdded.forEach(function (identity) {
            if (identity.id === message.address.bot.id) {
                schedule.scheduleJob(rule, function () {
                    bot.beginDialog(message.address, '/');
                })
            }
        });
    }
});

bot.dialog('/', [
    function (session) {
        builder.Prompts.text(session, "What is your name?");
    },
    function (session) {
    session.send("You said %s", session.message.text);
    }
]);

在此处输入图像描述


推荐阅读