node.js - 使用 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?");
无论如何,我正在进一步研究这一点。
一如既往,任何帮助/指针将不胜感激 - 谢谢。
解决方案
我能够通过将调度程序放在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);
}
]);
推荐阅读
- python - 如何从字典中按索引删除项目?
- r - 计算行差异并插入R中的新列(不使用for循环)
- sql-server - 用于检索状态列计数的 SQL 查询
- google-apps-script - 谷歌工作表脚本 - 当满足共同值时,停止填充与另一个数组进行比较的数组
- java - 在 Java 8 中我可以使用什么数据类型来代替“var”?
- php - laravel 将所有数组合并为一个
- sql - Oracle 触发器终止会话
- c++ - 我可以使用什么样的数据结构来处理这种方式
- javascript - javascript Date.toISOString() 返回差异日期值
- firebase - 错误:Firebase cURL 查询中未定义索引,即使在更新数据库规则之后也是如此