我正在设置LaunchDarkly以控制我的第一个功能标志及其在服务器和客户端的正常运行。
现在,我正在尝试LaunchDarkly Bootstrap方法(来自下面的给定链接),并像我的代码一样尝试,但是它不接受双括号,而且我不知道如何通过使用bootstrap方法来获取标志值,所以我在哪里出错了在我的代码中?有人可以帮我举个例子吗?

链接,

https://docs.launchdarkly.com/docs/js-sdk-reference#section-bootstrapping

使用Bootstrap选项初始化客户端,如下所示:
client = LDClient.initialize(sdkKey, userContext.user, options = {
        bootstrap: {
            {{ ldclient.all_flags(userContext.user) }}
       }
    });

还有我获取标志值的功能,
isFeatureEnabled: function (featureFlag, properties) {
        console.log("Before Variation");
        //we shall update the custom properties into user context.
        if (properties) {
            for (var k in properties) {
                userContext.user.custom[k] = properties[k];
            }
        }
        //later make the identity call to update the user details.
        client.identify(userContext.user, null, function () { /*rules updated*/
            console.log("New user's flags available");
            //validate the feature flag
            var showFeature = client.variation(featureFlag);
            if (!showFeature) {
                window.in8.platform.showUnauthorized('');
            }
            console.log("after Variation");
        });
    }

最佳答案

完全公开,我叫John,我是LaunchDarkly支持小组的成员。我很乐意为您解决这个问题

首先,看来您使用的是引导示例的旧版本。新示例具有一个错字修复程序,并使用了新的all_flags_state方法。

我在这里看到两个主要问题。主要问题是如何引导从后端到前端的标志变化,以及在使用 bootstrap 时如何适当利用LaunchDarkly。我将首先解决如何从后端引导标志变化的问题。

LaunchDarkly文档中的示例利用模板将自举值包括在前端。模板化是一种将以编程方式生成的内容包括在静态源或文本文件中的策略。模板通常在编译或部署代码时使用,或在将内容提供给客户端时在运行时使用。这样做是为了仅在那时提供最终版本的信息。

不同的模板语言的行为方式不同,但通常来说,您在源文件或文本文件中包含 token ,这些 token 指示模板渲染器用提供的数据替换该 token 。

它在文档中提到该示例用于使用Ruby进行模板化,但是该示例使用Mustache渲染,并且Mustache支持多种语言。模板化是一种将以编程方式生成的内容包括在静态源或文本文件中的策略。通常在编译或部署代码时使用,或在将内容提供给客户端时在运行时使用。这样做是为了仅在那时提供最终版本的信息。

该示例可能无法使用,具体取决于您所使用的后端语言和框架。根据与您的问题相关的标签,我可以安全地假设您正在使用.NET为后端供电,该后端没有规定的模板语言。但是,有许多开源解决方案。

在下面的示例中,我将使用https://github.com/rexm/Handlebars.Net将a用户引导的标志值呈现到result变量中。我将借用车把仓库中示例中的可用代码,以及LaunchDarkly的hello-bootstraphello-dotnet仓库中可用的代码,这些代码可在此处找到:https://github.com/launchdarkly/hello-bootstraphttps://github.com/launchdarkly/hello-dotnet

string source =
@"
<html>
    <head>
        <script src=""https://app.launchdarkly.com/snippet/ldclient.min.js""></script>
        <script>
            window.ldBootstrap={{ldBootstrap}};
            window.ldClientsideId=""{{ldClientsideId}}"";
            window.ldUser={{ldUser}};
        </script>
    </head>
    <body>
        <h1>LaunchDarkly server-side bootstrap example</h1>
        <ul>
             <li><code>normal client</code>: <span class=""normal"">initializing…</span></li>
             <li><code>bootstrapped client</code>: <span class=""bootstrap"">initializing…</span></li>
        </ul>

        <script>
            var user = window.ldUser;
            console.log(`Clients initialized`);
            var client = LDClient.initialize(window.ldClientsideId, user);
            var bootstrapClient = LDClient.initialize(window.ldClientsideId, user, {
                bootstrap: window.ldBootstrap
            });
            client.on('ready', handleUpdateNormalClient);
            client.on('change', handleUpdateNormalClient);
            bootstrapClient.on('ready', handleUpdateBootstrapClient);
            bootstrapClient.on('change', handleUpdateBootstrapClient);
            function handleUpdateNormalClient(){
                console.log(`Normal SDK updated`);
                render('.normal', client);
            }
            function handleUpdateBootstrapClient(){
                console.log(`Bootstrapped SDK updated`);
                render('.bootstrap', bootstrapClient);
            }

            function render(selector, targetClient) {
                document.querySelector(selector).innerHTML = JSON.stringify(targetClient.allFlags(user), null, 2);
            }
        </script>
    </body>
</html>";

var template = Handlebars.Compile(source);

Configuration ldConfig = LaunchDarkly.Client.Configuration.Default("YOUR_SDK_KEY");
LdClient client = new LdClient(ldConfig);
User user = User.WithKey("[email protected]")
    .AndFirstName("Bob")
    .AndLastName("Loblaw")
    .AndCustomAttribute("groups", "beta_testers");

var data = new {
    ldBootstrap: JsonConvert.SerializeObject(client.AllFlagsState(user)),
    ldUser = JsonConvert.SerializeObject(user),
    ldClientsideId = "YOUR_CLIENT_SIDE_ID"
};

var result = template(data);

您可以以该示例为例,并将其改编为向用户提供页面时呈现静态源代码。

第二个问题是您如何使用SDK。我看到您在每次评估用户之前都在 call 身份。每次调用时,请确定SDK需要重新初始化。这意味着,即使在引导了您的初始变体之后,您也将通过调用identify强制SDK重新初始化,从而消除了引导的所有好处。作为解决方案,检测您的用户对象是否已更改。如果有,请致电识别。否则,请勿调用ident,以便SDK使用缓存的用户属性。

如果您想更深入地研究这个问题,并为我们提供更多包装信息,请通过[email protected]与我们联系。

关于javascript - LaunchDarkly自举:(JS)属性分配预期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53416842/

10-13 02:37