Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En esta guía, usará el filtro de selección de destino para implementar una característica para audiencias de destino para la aplicación Node.js. Para más información sobre el filtro de destino, consulte Implementación de características en audiencias de destino.
Prerrequisitos
- Una cuenta de Azure con una suscripción activa. cree una de forma gratuita.
- Un almacén de configuración de aplicaciones, como se muestra en el tutorial para crear un almacén.
- Una bandera de características beta con filtro de segmentación. Crear la marca de característica.
- Versiones LTS de Node.js.
Creación de una aplicación web con una marca de característica
En esta sección, creará una aplicación web que use la marca de característica Beta para controlar el acceso a la versión beta de una página web.
Configurar un proyecto de Node.js Express
Cree una carpeta denominada
targeting-filter-tutoriale inicialice el proyecto.mkdir targeting-filter-tutorial cd targeting-filter-tutorial npm init -yInstale los siguientes paquetes.
npm install @azure/app-configuration-provider npm install @microsoft/feature-management npm install expressCree un nuevo archivo denominado app.js y agregue el código siguiente.
const express = require("express"); const server = express(); const port = "8080"; server.listen(port, () => { console.log(`Server is running at http://localhost:${port}`); });
Conexión a Azure App Configuration
Actualice el app.js y agregue el código siguiente.
// 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 ...Se conecta a Azure App Configuration para cargar marcas de características, habilitar la actualización automática y crear un
FeatureManagerobjeto para acceder a las marcas de características más adelante. Se agrega un middleware para actualizar la configuración antes de cada solicitud.Actualice el código para asegurarse de que el servidor Express se inicia solo después de inicializar correctamente la configuración.
// Existing code ... initializeConfig() .then(() => { // Start the express server. server.listen(port, () => { console.log(`Server is running at http://localhost:${port}`); }); })
Uso de la marca de características
Agregue el código siguiente al archivo app.js para configurar el controlador de rutas para el servidor Express. El servidor proporcionará contenido diferente en función de si la marca de características beta está habilitada.
// 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 ...
Habilitación de la selección de destino para la aplicación web
Se requiere un contexto de segmentación al evaluar las funciones con la segmentación habilitada. Para proporcionar explícitamente este contexto para la evaluación de características, puede pasarlo como parámetro al featureManager.isEnabled método .
const isBetaEnabled = await featureManager.isEnabled("Beta", { userId: "UserA", groups: ["Group1"] });
En una aplicación web, el contexto de destino también se puede proporcionar como contexto ambiente mediante la implementación de la interfaz ITargetingContextAccessor . Un contexto de destino de ambiente significa que la información de destino se recupera automáticamente del entorno, como la solicitud HTTP actual, sin necesidad de pasarla explícitamente a cada llamada a featureManager.isEnabled().
En este tutorial se usa el contexto de destino de ambiente.
Agregue el código siguiente después de la declaración del servidor Express. Se utiliza
AsyncLocalStoragepara almacenar la solicitud actual, lo que permite al administrador de características recuperar automáticamente el contexto de destino a través de un callback del accesor de contexto de destino. Para obtener más información, consulte Uso de AsyncLocalStorage para el contexto de solicitud.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 ...Al construir el
FeatureManager, pase el descriptor de acceso de contexto de destino aFeatureManagerOptions.featureManager = new FeatureManager( new ConfigurationMapFeatureFlagProvider(appConfig), { targetingContextAccessor: targetingContextAccessor });
Después de completar los pasos anteriores, el archivo app.js ahora debe contener la siguiente implementación completa.
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}`);
});
})
Filtro de selección de destino en acción
Establezca la variable de entorno denominada AZURE_APPCONFIG_ENDPOINT en el punto de conexión del almacén de App Configuration que se encuentra en la Información general del almacén en Azure Portal.
Si usa el símbolo del sistema de Windows, ejecute el siguiente comando y reinícielo para que se aplique el cambio:
setx AZURE_APPCONFIG_ENDPOINT "<endpoint-of-your-app-configuration-store>"Si usa PowerShell, ejecute el siguiente comando:
$Env:AZURE_APPCONFIG_ENDPOINT = "<endpoint-of-your-app-configuration-store>"Si usa macOS o Linux, ejecute el siguiente comando:
export AZURE_APPCONFIG_ENDPOINT='<endpoint-of-your-app-configuration-store>'Ejecute la aplicación.
node app.jsAbra el explorador web y vaya a
localhost:8080. Debería ver la vista predeterminada de la aplicación.
-
- Agregue
userIdcomo parámetro de consulta en la dirección URL para especificar el identificador de usuario. Visitelocalhost:8080/?userId=test@contoso.com. Verá la página beta, porquetest@contoso.comse especifica como un usuario objetivo.
- Agregue
Visite
localhost:8080/?userId=testuser@contoso.com. No puede ver la página beta, ya quetestuser@contoso.comse especifica como un usuario excluido.
Pasos siguientes
Para obtener más información sobre los filtros de características, continúe con los siguientes documentos.
Para obtener la lista completa de características de la biblioteca de administración de características de JavaScript, continúe al siguiente documento.