我一直盯着这几个小时,找不到解决方案,即使所有的建议都应该很容易 - https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-proactive-messages .
我创建了一个简单的代码,它将“注册”用户并将其数据保存在Azure上的cosmosDatabse中 . 这非常有效 .
//ON "register" SAVE USER DATA AND SAY REGISTERED MESSAGE
bot.dialog('adhocDialog', function(session, args) {
var savedAddress = session.message.address;
session.userData.savedAddress = savedAddress;
//REGISTERED MESSAGE
session.endDialog("*Congratulations! You are now registered in our network! (goldmedal)*");
})
.triggerAction({
matches: /^register$/i
})
- But how can I then access that specific user and send him a message if, say, a condition is met? (实际上是在HTTP请求上)
我相当肯定我们必须在某处写对话ID或用户ID . 问题是在哪里?
function startProactiveDialog(address) {
bot.beginDialog(address, "A notification!");
}
- 这是我认为它应该是多么简单 . 但是你在哪里指定用户呢?
3 回答
您已将用户的地址保存到
session.userData.savedAddress
,已将其保存在数据库中 . 当事件触发时,对数据库执行查询,以检查满足两个条件的用户 .他们已注册听取此次活动
他们的地址已保存在数据库中 .
在您的情况下,您可以将属性保存到
session.userData
对象,该对象列出了他们正在侦听的事件 . 如果您只需要向用户发送消息,则只需使用bot.loadSession(savedAddress)来ping用户即可 .编辑:
因此,您应该向CosmosDB发送一个查询,而不是专门查看用户ID,该查询会查找具有与该事件对应的“监听”布尔类型标志的条目 .
你're not worrying about the user ID at first, you'只是检索所有条目(广义上说)看起来像这样的条目:
SELECT * FROM BotState WHERE data LIKE 'listenForEvent=1
.因此,要设置
session.userData
以使上述理论查询起作用,您需要将问题中的代码片段修改为如下所示:实际上,
savedAddress
应该是IAddress的实例,并且Message类下的函数loadSession(address: IAddress, callback: (err: Error, session: Session) => void): void;和address(adr: IAddress): Message;都需要IAddress
作为参数 .首先,您应该将整个地址json对象保存在cosmosDB中以供以后使用 .
由于Node.js的botbuilder是基于Restify或Express构建的,因此您可以为用户构建一条添加路由来触发和发送主动消息 . 工作流程可能如下:
指导用户使用数据库中的帐户映射注册和保存用户的地址对象
在Restify或Expressjs中创建路由以触发主动消息:
或者如果你想利用
loadSession
我创建了一个users.json文件,我保存了所有用户 . 它按照我需要的方式工作 . 我想数据库会更好,但我真的不知道从哪里开始 . 数据库是我尚未遇到的全新篇章,因此在解决项目需求时对其进行处理是没有意义的 .