Udostępnij za pomocą


Wdrażanie funkcji dla docelowych odbiorców w aplikacji Node.js

W tym przewodniku użyjesz filtra docelowego, aby udostępnić funkcję dla docelowych odbiorców aplikacji Node.js. Aby uzyskać więcej informacji na temat filtru określania wartości docelowej, zobacz Wdrażanie funkcji dla docelowych odbiorców.

Wymagania wstępne

Tworzenie aplikacji internetowej z flagą funkcji

W tej sekcji utworzysz aplikację internetową, która używa flagi funkcji Beta do kontrolowania dostępu do wersji beta strony internetowej.

Konfigurowanie projektu Node.js Express

  1. Utwórz folder o nazwie targeting-filter-tutorial i zainicjuj projekt.

    mkdir targeting-filter-tutorial
    cd targeting-filter-tutorial
    npm init -y
    
  2. Zainstaluj następujące pakiety.

    npm install @azure/app-configuration-provider
    npm install @microsoft/feature-management
    npm install express
    
  3. Utwórz nowy plik o nazwie app.js i dodaj następujący kod.

    const express = require("express");
    const server = express();
    const port = "8080";
    
    server.listen(port, () => {
        console.log(`Server is running at http://localhost:${port}`);
    });
    

Nawiązywanie połączenia z usługą Azure App Configuration

  1. Zaktualizuj app.js i dodaj następujący kod.

    // Existing code ...
    const appConfigEndpoint = process.env.AZURE_APPCONFIG_ENDPOINT;
    const { DefaultAzureCredential } = require("@azure/identity");
    const { load } = require("@azure/app-configuration-provider");
    const { FeatureManager, ConfigurationMapFeatureFlagProvider } = require("@microsoft/feature-management");
    
    let appConfig;
    let featureManager;
    
    async function initializeConfig() {
        // Load feature flags from App Configuration.
        appConfig = await load(appConfigEndpoint, new DefaultAzureCredential(), {
            featureFlagOptions: {
                enabled: true,
                refresh: {
                    enabled: true
                }
            }
        });
    
        // Create feature manager with feature flag provider that accesses feature flags from App Configuration.
        featureManager = new FeatureManager(
            new ConfigurationMapFeatureFlagProvider(appConfig));
    }
    
    // Use a middleware to refresh the configuration before each request.
    server.use((req, res, next) => {
        appConfig.refresh();
        next();
    });
    // Existing code ...
    

    Połączysz się z usługą Azure App Configuration, aby załadować flagi funkcji, włączyć automatyczne odświeżanie i utworzyć FeatureManager obiekt na potrzeby uzyskiwania dostępu do flag funkcji później. Środkowe oprogramowanie jest dodawane w celu odświeżenia konfiguracji przed każdym żądaniem.

  2. Zaktualizuj kod, aby upewnić się, że serwer Express jest uruchamiany dopiero po pomyślnym zainicjowaniu konfiguracji.

    // Existing code ...
    initializeConfig()
        .then(() => {
            // Start the express server.
            server.listen(port, () => {
                console.log(`Server is running at http://localhost:${port}`);
            });
        })
    

Używanie flagi funkcji

Dodaj następujący kod do pliku app.js , aby skonfigurować procedurę obsługi tras dla serwera Express. Serwer będzie obsługiwać różne treści w zależności od tego, czy flaga funkcji beta jest włączona.

// Existing code ...
server.get("/", async (req, res) => {
    const isBetaEnabled = await featureManager.isEnabled("Beta");
    const [title, message] = isBetaEnabled 
        ? ["Beta Page", "This is a beta page."]
        : ["Home Page", "Welcome."];
    
    res.send(
        `<!DOCTYPE html>
        <html>
            <head><title>${title}</title></head>
            <body style="display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0;">
                <h1 style="text-align: center; font-size: 5rem;">${message}</h1>
            </body>
        </html>`
    );
});

initializeConfig()
// Existing code ...

Włączanie określania wartości docelowej dla aplikacji internetowej

Kontekst targetowania jest wymagany podczas oceniania funkcji z włączonym targetowaniem. Aby jawnie podać ten kontekst do oceny funkcji, można przekazać go jako parametr do featureManager.isEnabled metody .

const isBetaEnabled = await featureManager.isEnabled("Beta", { userId: "UserA", groups: ["Group1"] });

W aplikacji internetowej kontekst docelowy może być również udostępniany jako kontekst otoczenia przez zaimplementowanie interfejsu ITargetingContextAccessor . Kontekst docelowy otoczenia oznacza, że informacje o celu są automatycznie pobierane ze środowiska, na przykład z bieżącego żądania HTTP, bez konieczności ich jawnego przekazywania przy każdym wywołaniu featureManager.isEnabled().

Kontekst określania wartości docelowej otoczenia jest używany w tym samouczku.

  1. Dodaj następujący kod po deklaracji serwera Express. Używa AsyncLocalStorage do przechowywania bieżącego żądania, dzięki czemu menedżer funkcji może automatycznie pobrać kontekst targetowania za pomocą wywołania zwrotnego dostępu do tego kontekstu. Aby uzyskać więcej informacji, zobacz Using AsyncLocalStorage for request context (Korzystanie z usługi AsyncLocalStorage dla kontekstu żądania).

    const express = require("express");
    const server = express();
    const port = 8080;
    
    const { AsyncLocalStorage } = require("async_hooks");
    const requestAccessor = new AsyncLocalStorage();
    // Use a middleware to store request context.
    server.use((req, res, next) => {
        // Store the request in AsyncLocalStorage for this request chain.
        requestAccessor.run(req, () => {
            next();
        });
    });
    
    // Create a targeting context accessor that retrieves user data from the current request.
    const targetingContextAccessor = {
        getTargetingContext: () => {
            // Get the current request from AsyncLocalStorage.
            const request = requestAccessor.getStore();
            if (!request) {
                return undefined;
            }
            const { userId, groups } = request.query;
            return {
                userId: userId,
                groups: groups ? groups.split(",") : [] 
            };
        }
    };
    // Existing code ...
    
  2. Podczas konstruowania FeatureManager, należy przekazać dostęp do kontekstu docelowego do FeatureManagerOptions.

    featureManager = new FeatureManager(
        new ConfigurationMapFeatureFlagProvider(appConfig),
        {
            targetingContextAccessor: targetingContextAccessor
        });
    

Po wykonaniu poprzednich kroków plik app.js powinien teraz zawierać następującą kompletną implementację.

const express = require("express");
const server = express();
const port = 8080;

const { AsyncLocalStorage } = require("async_hooks");
const requestAccessor = new AsyncLocalStorage();
// Use a middleware to store request context
server.use((req, res, next) => {
    // Store the request in AsyncLocalStorage for this request chain
    requestAccessor.run(req, () => {
        next();
    });
});

// Create a targeting context accessor that retrieves user data from the current request
const targetingContextAccessor = {
    getTargetingContext: () => {
        // Get the current request from AsyncLocalStorage
        const request = requestAccessor.getStore();
        if (!request) {
            return undefined;
        }
        const { userId, groups } = request.query;
        return {
            userId: userId,
            groups: groups ? groups.split(",") : [] 
        };
    }
};

const appConfigEndpoint = process.env.AZURE_APPCONFIG_ENDPOINT;
const { DefaultAzureCredential } = require("@azure/identity");
const { load } = require("@azure/app-configuration-provider");
const { FeatureManager, ConfigurationMapFeatureFlagProvider } = require("@microsoft/feature-management");

let appConfig;
let featureManager;

async function initializeConfig() {
    // Load feature flags from App Configuration.
    appConfig = await load(appConfigEndpoint, new DefaultAzureCredential(), {
        featureFlagOptions: {
            enabled: true,
            refresh: {
                enabled: true
            }
        }
    });

    // Create feature manager with feature flag provider that accesses feature flags from App Configuration and targeting context accessor.
    featureManager = new FeatureManager(
        new ConfigurationMapFeatureFlagProvider(appConfig),
        {
            targetingContextAccessor: targetingContextAccessor
        });
}

// Use a middleware to refresh the configuration before each request
server.use((req, res, next) => {
    appConfig.refresh();
    next();
});

server.get("/", async (req, res) => {
    const isBetaEnabled = await featureManager.isEnabled("Beta");
    const [title, message] = isBetaEnabled 
        ? ["Beta Page", "This is a beta page."]
        : ["Home Page", "Welcome."];
    
    res.send(
        `<!DOCTYPE html>
        <html>
            <head><title>${title}</title></head>
            <body style="display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0;">
                <h1 style="text-align: center; font-size: 5rem;">${message}</h1>
            </body>
        </html>`
    );
});

// Initialize the configuration and start the server
initializeConfig()
    .then(() => {
        // Start the express server.
        server.listen(port, () => {
            console.log(`Server is running at http://localhost:${port}`);
        });
    })

Filtr określania wartości docelowej w akcji

  1. Ustaw zmienną środowiskową o nazwie AZURE_APPCONFIG_ENDPOINT na punkt końcowy Twojego sklepu App Configuration, który znajdziesz w sekcji Przegląd w portalu Azure.

    Jeśli używasz wiersza polecenia systemu Windows, uruchom następujące polecenie i uruchom ponownie wiersz polecenia, aby zezwolić na wprowadzenie zmian:

    setx AZURE_APPCONFIG_ENDPOINT "<endpoint-of-your-app-configuration-store>"
    

    Jeśli używasz programu PowerShell, uruchom następujące polecenie:

    $Env:AZURE_APPCONFIG_ENDPOINT = "<endpoint-of-your-app-configuration-store>"
    

    Jeśli używasz systemu macOS lub Linux, uruchom następujące polecenie:

    export AZURE_APPCONFIG_ENDPOINT='<endpoint-of-your-app-configuration-store>'
    
  2. Uruchom aplikację.

    node app.js
    
  3. Otwórz przeglądarkę i przejdź do localhost:8080. Powinien zostać wyświetlony widok domyślny aplikacji.

    Zrzut ekranu aplikacji przedstawiający domyślny komunikat powitania.

    1. Dodaj userId jako parametr zapytania w adresie URL, aby określić identyfikator użytkownika. Odwiedź localhost:8080/?userId=test@contoso.com. Zostanie wyświetlona strona beta, ponieważ test@contoso.com jest określona jako docelowy użytkownik.

    Zrzut ekranu aplikacji przedstawiający stronę beta.

  4. Odwiedź localhost:8080/?userId=testuser@contoso.com. Nie można wyświetlić strony beta, ponieważ testuser@contoso.com jest określona jako wykluczony użytkownik.

    Zrzut ekranu przedstawiający aplikację z zawartością domyślną.

Dalsze kroki

Aby dowiedzieć się więcej na temat filtrów funkcji, przejdź do następujących dokumentów.

Aby uruchomić pełną funkcję biblioteki zarządzania funkcjami języka JavaScript, przejdź do następującego dokumentu.