Webhook全局变量

时间:2018-04-05 19:53:03

标签: node.js dialogflow facebook-messenger-bot api-ai facebook-webhooks

我为我的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();
}

1 个答案:

答案 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
  ]
}