Dela via


Distribuera funktioner till målgrupper i ett Node.js program

I den här guiden använder du målfiltret för att distribuera en funktion till målgrupper för ditt Node.js program. Mer information om målfiltret finns i Distribuera funktioner till målgrupper.

Förutsättningar

Skapa ett webbprogram med en funktionsflagga

I det här avsnittet skapar du ett webbprogram som använder funktionsflaggan Beta för att styra åtkomsten till betaversionen av en webbsida.

Konfigurera ett Node.js Express-projekt

  1. Skapa en mapp med namnet targeting-filter-tutorial och initiera projektet.

    mkdir targeting-filter-tutorial
    cd targeting-filter-tutorial
    npm init -y
    
  2. Installera följande paket.

    npm install @azure/app-configuration-provider
    npm install @microsoft/feature-management
    npm install express
    
  3. Skapa en ny fil med namnet app.js och lägg till följande kod.

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

Ansluta till Azure App Configuration

  1. Uppdatera app.js och lägg till följande 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 ...
    

    Du ansluter till Azure App Configuration för att läsa in funktionsflaggor, aktivera automatisk uppdatering och skapa ett FeatureManager objekt för att komma åt funktionsflaggor senare. Ett mellanprogram läggs till för att uppdatera konfigurationen före varje begäran.

  2. Uppdatera koden för att säkerställa att Express-servern startar först när konfigurationen har initierats.

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

Använda funktionsflaggan

Lägg till följande kod i filenapp.js för att konfigurera routningshanteraren för Express-servern. Servern hanterar olika innehåll baserat på om betafunktionsflaggan är aktiverad.

// 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 ...

Aktivera mål för webbprogrammet

En målkontext krävs när du utvärderar funktioner med inriktning aktiverat. Om du uttryckligen vill ange den här kontexten featureManager.isEnabled för funktionsutvärdering kan du skicka den som en parameter till metoden.

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

I ett webbprogram kan målkontexten också tillhandahållas som en omgivande kontext genom att implementera gränssnittet ITargetingContextAccessor . En kontext för omgivande mål innebär att målinformation hämtas automatiskt från miljön, till exempel den aktuella HTTP-begäran, utan att du uttryckligen behöver skicka den till varje featureManager.isEnabled() anrop.

Du använder ambient målkontext i denna handledning.

  1. Lägg till följande kod efter Express Server-deklarationen. Den använder AsyncLocalStorage för att lagra den aktuella begäran, vilket gör att funktionshanteraren automatiskt kan hämta målkontexten via en accessor callback för målkontext. Mer information finns i Använda AsyncLocalStorage för begärandekontext.

    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. När du skapar FeatureManager, skicka målkontextåtkomstören till FeatureManagerOptions.

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

När du har slutfört föregående steg bör din app.js-fil nu innehålla följande fullständiga implementering.

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

Målfilter i praktiken

  1. Ange miljövariabeln med namnet AZURE_APPCONFIG_ENDPOINT till slutpunkten för din App Configuration-butik som finns i Azure-portalen under Översikt över din butik.

    Om du använder Windows-kommandotolken kör du följande kommando och startar om kommandotolken så att ändringen börjar gälla:

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

    Om du använder PowerShell kör du följande kommando:

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

    Om du använder macOS eller Linux kör du följande kommando:

    export AZURE_APPCONFIG_ENDPOINT='<endpoint-of-your-app-configuration-store>'
    
  2. Kör programmet.

    node app.js
    
  3. Öppna din webbläsare och gå till localhost:8080. Du bör se standardvyn för appen.

    Skärmbild av appen som visar standardhälsningsmeddelandet.

    1. Lägg till userId som en frågeparameter i URL:en för att ange användar-ID. Besök localhost:8080/?userId=test@contoso.com. Du ser betasidan eftersom test@contoso.com har angetts som en målanvändare.

    Skärmbild av appen som visar betasidan.

  4. Besök localhost:8080/?userId=testuser@contoso.com. Du kan inte se betasidan eftersom testuser@contoso.com den har angetts som en exkluderad användare.

    Skärmbild av appen som visar standardinnehållet.

Nästa steg

Om du vill veta mer om funktionsfiltren fortsätter du till följande dokument.

För den fullständiga funktionskörningen av JavaScript-funktionshanteringsbiblioteket fortsätter du till följande dokument.