1

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

            });

        }

将上下文更新发送到对话流:

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

1 回答 1

2

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

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

在您的 webhook 中,您可以将用户 ID 和您想要的任何其他会话信息保存为Context参数的一部分。您可以在实现代码中将其设置为具有较长生命周期的传出上下文和/或在每次调用 webhook 时重新保存此上下文。您没有提供有关您当前在 webhook 中使用的代码的任何信息,但您可以查看有关 Context 如何成为响应 JSON的一部分或使用库的文档。

需要明确的是 - 您可以在响应中将 Context 作为 JSON 的一部分返回。您无需进行 REST 调用即可对其进行设置。上下文与它们的生命周期一样长,因此一旦设置了它,它将在会话期间为“生命周期”调用而存在,或者您可以每次设置新的(或更新它们的生命周期)作为您返回的 JSON 的一部分。

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

更新以响应您的代码

不需要正在进行的 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
  ]
}
于 2018-04-05T20:10:07.400 回答