LaunchDarkly Bootstrapping: (JS) Ожидается назначение свойства - PullRequest
0 голосов
/ 21 ноября 2018

Я настраиваю LaunchDarkly, чтобы контролировать свой первый флаг функции и он нормально работает со стороны сервера и клиента.Теперь я пытаюсь использовать подход LaunchDarkly 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");
        });
    }

1 Ответ

0 голосов
/ 27 ноября 2018

Полное раскрытие, меня зовут Джон, и я являюсь частью команды поддержки здесь, в LaunchDarkly.Я буду рад помочь вам с этой проблемой

Во-первых, похоже, вы используете более старую версию примера начальной загрузки.Новый пример содержит исправление опечатки и использует новый метод all_flags_state.

Здесь я вижу две основные проблемы.Основная проблема заключается в том, как загрузить варианты флагов с внутреннего и внешнего интерфейса и как правильно использовать LaunchDarkly при использовании начальной загрузки.Сначала я рассмотрю вопрос о том, как сначала загрузить варианты флагов из серверной части.

В примере, приведенном в документации LaunchDarkly, используются шаблоны для включения значений начальной загрузки в интерфейсную часть.Шаблонирование - это стратегия для включения программно сгенерированного контента в ваш статический источник или текстовые файлы.Шаблонирование обычно используется при компиляции или развертывании кода, или во время выполнения при передаче контента клиентам.Это сделано для того, чтобы сделать информацию доступной только в то время в окончательной версии.

Различные языки шаблонов ведут себя по-разному, но, вообще говоря, вы включаете токены в свои исходные или текстовые файлы, которые заставляют средство визуализации шаблона заменять это.токен с данными, которые вы предоставляете.

В документации упоминается, что этот пример предназначен для шаблонирования с использованием Ruby, но в примере используется рендеринг усов, и усы доступны на многих разных языках.Шаблонирование - это стратегия для включения программно сгенерированного контента в ваш статический источник или текстовые файлы.Это обычно используется при компиляции или развертывании кода или во время выполнения при передаче контента клиентам.Это сделано для того, чтобы сделать информацию доступной только в то время в окончательной версии.

Пример может не работать в зависимости от того, какой язык и инфраструктуру вы используете.В соответствии с тегами, связанными с вашим вопросом, я могу с уверенностью предположить, что вы используете .NET для поддержки своего бэкэнда, у которого нет предписанного языка шаблонов.Однако существует множество решений с открытым исходным кодом.

В следующем примере я собираюсь использовать https://github.com/rexm/Handlebars.Net для рендеринга значений флага начальной загрузки пользователя в переменную result.Я собираюсь позаимствовать код, доступный из примера в репозитории баров ручки и из репозиториев LaunchDarkly hello-bootstrap и hello-dotnet, которые доступны здесь: https://github.com/launchdarkly/hello-bootstrap & https://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("bob@example.com")
    .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.Я вижу, что вы называете идентификацию, прежде чем оценивать своего пользователя каждый раз.Каждый раз, когда вы звоните, идентифицируйте SDK, необходимо повторно инициализировать.Это означает, что даже после начальной загрузки ваших начальных вариантов вы заставите SDK переинициализироваться, вызвав функцию identifier, удалив все преимущества начальной загрузки.В качестве решения определите, изменился ли ваш пользовательский объект.если есть, то позвоните идентифицировать.В противном случае, не вызывайте identifier, чтобы в SDK использовались кэшированные пользовательские атрибуты.

Если вы хотите глубже вникнуть в это и предоставить нам еще какой-нибудь источник вашей оболочки, вы можете обратиться к нам в службу поддержки.@ launchdarkly.com

...