Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
- Konto Azure z aktywną subskrypcją. Utwórz je bezpłatnie.
- Magazyn usługi App Configuration, jak pokazano w samouczku dotyczącym tworzenia magazynu konfiguracji aplikacji.
- Flaga funkcji beta z filtrem określania wartości docelowej. Utwórz flagę funkcji.
- Wersje LTS Node.js.
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
Utwórz folder o nazwie
targeting-filter-tutoriali zainicjuj projekt.mkdir targeting-filter-tutorial cd targeting-filter-tutorial npm init -yZainstaluj następujące pakiety.
npm install @azure/app-configuration-provider npm install @microsoft/feature-management npm install expressUtwó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
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ć
FeatureManagerobiekt na potrzeby uzyskiwania dostępu do flag funkcji później. Środkowe oprogramowanie jest dodawane w celu odświeżenia konfiguracji przed każdym żądaniem.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.
Dodaj następujący kod po deklaracji serwera Express. Używa
AsyncLocalStoragedo 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 ...Podczas konstruowania
FeatureManager, należy przekazać dostęp do kontekstu docelowego doFeatureManagerOptions.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
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>'Uruchom aplikację.
node app.jsOtwórz przeglądarkę i przejdź do
localhost:8080. Powinien zostać wyświetlony widok domyślny aplikacji.
-
- Dodaj
userIdjako 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.comjest określona jako docelowy użytkownik.
- Dodaj
Odwiedź
localhost:8080/?userId=testuser@contoso.com. Nie można wyświetlić strony beta, ponieważtestuser@contoso.comjest określona jako wykluczony użytkownik.
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.