我为我的facebook messenger bot创建了一个node.js webhook。 bot是在对话框流中构建的,数据库连接到firebase。我的问题是在webhook中调用函数登录时,登录后,我从数据库中获取了一个userID,我希望将其存储在代码中的某个位置,以便在整个用户会话中提供userID信息。我将它存储在一个全局变量中。但是,如果只有一个用户使用机器人,这可以正常工作。如果另一个用户同时使用机器人,则此用户ID信息在用户之间共享,因为它存储在全局变量中。我该如何解决这个问题?请帮忙。
var loggedIn = true;
for (i = 0; i < contexts.length; i++) {
console.log("Inside contexts for loop");
//Check for login details context.
if (contexts[i].name == "logindetails") {
if (contexts[0].parameters.loggedIn == "true") {
//set this true if found.
loggedIn = true;
}
}
}
if (loggedIn) {
showUserAccountOptions(sender);
} //else start the login flow and once logged in create the 'logindetails' contexts and set the loggedIn parameter as true.
else {
//Login
login(email, password);
//Post the logindetails contexts
console.log("Not found");
let url = "https://api.dialogflow.com/v1/contexts?sessionId=" + response.sessionId;
console.log("URL", url);
var con = {
method: 'POST',
url: url,
qs: { access_token: '****' },
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer' + ' ****'
},
body:
[
{
"lifespan": 25,
"name": "logindetails",
"parameters": {
"loggedIn": "true"
}
}
],
json: true
};
request(con, function (error, response, body) {
console.log("Inside api request");
if (error) {
console.log("Inside Error", error);
}
else{
//show user options
showUserAccountOptions(sender);
}
});
}
向对话框流发送上下文更新:
let apirespone = let apirespone = {
"contexts": [
{
"name": "logindetails",
"parameters": {},
"lifespan": 5
}
]
}
sendToApiAi(sender,apirespone);
function sendToApiAi(sender, text) {
sendTypingOn(sender);
let apiaiRequest = apiAiService.textRequest(text, {
sessionId: sessionIds.get(sender)
});
apiaiRequest.on('response', (response) => {
if (isDefined(response.result)) {
handleApiAiResponse(sender, response);
}
});
apiaiRequest.on('error', (error) => console.error(error));
apiaiRequest.end();
}
答案 0 :(得分:2)
好的电话!您绝对不 希望将其存储在全局变量中。
幸运的是,Dialogflow为此提供了一个很好的解决方案。
在您的webhook中,您可以将所需的userID和任何其他会话信息保存为Context参数的一部分。您可以在履行代码中将此设置为外发上下文,使用寿命很长和/或每次调用webhook时重新保存此上下文。您没有提供有关您当前在webhook中使用的代码的任何信息,但是您可以查看有关Context如何成为response JSON或使用库的文档的文档。
要清楚 - 您可以在响应中将Context作为JSON的一部分返回。您不需要进行REST调用来设置它。上下文只有它们的生命周期,所以一旦你设置了它,它将在会话期间进行“终身”调用,或者你可以每次设置新的(或更新它们的生命周期)作为你返回的JSON的一部分。 / p>
在下一个电话中,您将通过当前有效的所有上下文。您可以找到存储先前保存状态的那个,并从参数中获取值。
更新以回复您的代码
你不需要你正在进行的REST呼叫。
您可以在JSON中返回并更新上下文。你没有展示它,但我假设你正在创建一个响应,添加上下文可能看起来像这样:
{
"displayText": "Show something",
"contextOut":[
"name": "logindetails",
"lifespan": 25,
"parameters": {
"loggedIn": "true"
}
]
}
在对话的稍后阶段,您可以在回复中重新发送此信息以更新信息。你可以这样做:
在获取信息的循环中,您可以保存整个上下文:
var logindetails;
if (contexts[i].name == "logindetails") {
logindetails = contexts[i];
if (logindetails.parameters.loggedIn == "true") {
//set this true if found.
loggedIn = true;
}
}
然后,您可以在logindetails
中更改所需内容,并在创建响应时执行以下操作:
{
"displayText": "Show something",
"contextOut":[
loginDetails
]
}