Webhook 全局变量

Webhook Global Variable

我已经为我的 Facebook Messenger 机器人创建了一个 node.js webhook。该机器人内置于对话流中,数据库连接到 firebase。我的问题是在 webhook 中调用函数进行登录时,登录后,我从数据库中获取了一个用户 ID,我想将其存储在代码中的某个位置,以便用户 ID 信息在整个用户会话中可用。我将它存储在一个全局变量中。但是,如果只有一个用户在使用该机器人,这就可以正常工作。如果另一个用户同时使用机器人,则此用户 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);
                }

            });

        }

正在将上下文更新发送到 dialogflow:

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

好电话!您绝对不想将其存储在全局变量中。

幸运的是,Dialogflow 提供了一个很好的解决方案。

在您的 webhook 中,您可以将用户 ID 和您想要的任何其他会话信息保存为 Context parameter. You can set this as an Outgoing Context in your fulfillment code with a long lifespan and/or re-save this Context each time your webhook is called. You don't provide anything about the code you're currently using in your webhook, but you can see the documentation for how the Context can be part of your response JSON 的一部分或使用库。

要清楚 - 您可以 return 上下文作为响应中 JSON 的一部分。您不需要 进行 REST 调用来设置它。上下文与它们的生命周期一样长,所以一旦你设置了一个,它将在会话期间为 "lifetime" 调用而存在,或者你可以每次设置新的(或更新它们的生命周期)作为 [=48] 的一部分=]你return.

在下一次通话中,您将收到当前有效的所有上下文。您可以找到存储您之前保存的状态的那个,并从参数中获取值。

更新以回复您的代码

不需要您正在进行的 REST 调用。

您可以 return 并更新 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
  ]
}