Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
- Ett Azure-konto med en aktiv prenumeration. Skapa en kostnadsfritt.
- En App Configuration-butik, som visas i guiden för att skapa en App Configuration-butik.
- En betafunktionsflagga med målfilter. Skapa funktionsflaggan.
- LTS-versioner av Node.js.
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
Skapa en mapp med namnet
targeting-filter-tutorialoch initiera projektet.mkdir targeting-filter-tutorial cd targeting-filter-tutorial npm init -yInstallera följande paket.
npm install @azure/app-configuration-provider npm install @microsoft/feature-management npm install expressSkapa 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
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
FeatureManagerobjekt för att komma åt funktionsflaggor senare. Ett mellanprogram läggs till för att uppdatera konfigurationen före varje begäran.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.
Lägg till följande kod efter Express Server-deklarationen. Den använder
AsyncLocalStoragefö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 ...När du skapar
FeatureManager, skicka målkontextåtkomstören tillFeatureManagerOptions.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
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>'Kör programmet.
node app.jsÖppna din webbläsare och gå till
localhost:8080. Du bör se standardvyn för appen.
-
- Lägg till
userIdsom en frågeparameter i URL:en för att ange användar-ID. Besöklocalhost:8080/?userId=test@contoso.com. Du ser betasidan eftersomtest@contoso.comhar angetts som en målanvändare.
- Lägg till
Besök
localhost:8080/?userId=testuser@contoso.com. Du kan inte se betasidan eftersomtestuser@contoso.comden har angetts som en exkluderad användare.
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.