DocumentatieAEMTutorials voor AEMTutorials voor AEM as a Cloud Service

AEM Events processing using Adobe I/O Runtime Action

Laatst bijgewerkt: 5 mei 2025
  • Van toepassing op:
  • Experience Manager as a Cloud Service
  • Onderwerpen:
  • Ontwikkelen
  • App Builder

Gemaakt voor:

  • Beginner
  • Ontwikkelaar

Leer hoe te om ontvangen Gebeurtenissen van AEM te verwerken gebruikend Adobe I/O RuntimeActie. Dit voorbeeld verbetert het vroegere voorbeeld Actie van Adobe I/O Runtime en de Gebeurtenissen van AEM, zorg ervoor u het alvorens met dit hebt voltooid.

In dit voorbeeld worden de oorspronkelijke gebeurtenisgegevens en de ontvangen gebeurtenis opgeslagen als een activiteitenbericht in Adobe I/O Runtime-opslag. Nochtans, als de gebeurtenis van Gewijzigd het Fragment van de Inhoud type is, dan roept het ook de auteursdienst van AEM om de wijzigingsdetails te vinden. Tot slot toont het de gebeurtenisdetails in één enkele paginatoepassing (SPA).

Voorwaarden

U hebt het volgende nodig om deze zelfstudie te voltooien:

  • Het milieu van AEM as a Cloud Service met toegelaten de Gebeurtenis van AEM. Ook, moet het steekproef 🔗 project van de Plaatsen WKND worden opgesteld aan het.

  • Toegang tot Adobe Developer Console.

  • Adobe Developer CLIgeïnstalleerd op uw lokale machine.

  • Lokaal geïnitialiseerd project van het vroegere voorbeeld de Actie van Adobe I/O Runtime en de Gebeurtenissen van AEM.

AEM Events Processor, actie

In dit voorbeeld, voert de actie van de gebeurtenisbewerker 🔗 volgende taken uit:

  • Parseert ontvangen gebeurtenis in een activiteitenbericht.
  • Als de ontvangen gebeurtenis van Gewijzigd van het Fragment van de Inhoud type is, vraag terug naar de auteursdienst van AEM om de wijzigingsdetails te vinden.
  • Hiermee worden de oorspronkelijke gebeurtenisgegevens, het activiteitenbericht en eventuele wijzigingsgegevens in Adobe I/O Runtime-opslag gehandhaafd.

Om bovengenoemde taken uit te voeren, laten wij beginnen door een actie aan het project toe te voegen, JavaScript modules te ontwikkelen om de bovengenoemde taken uit te voeren, en tenslotte de actiecode bij te werken om de ontwikkelde modules te gebruiken.

Verwijs naar het in bijlage WKND-AEM-Event-Runtime-Action.zipdossier voor de volledige code, en onder sectie benadrukt de belangrijkste dossiers.

Handeling toevoegen

  • Voer de volgende opdracht uit om een handeling toe te voegen:

    aio app add action
    
  • Selecteer @adobe/generator-add-action-generic als actiesjabloon en geef de handeling de naam aem-event-processor .

    voeg actie toe

JavaScript-modules ontwikkelen

Om de hierboven vermelde taken uit te voeren, ontwikkelen de volgende modules van JavaScript.

  • De src/dx-excshell-1/actions/aem-event-processor/eventValidator.js module bepaalt als de ontvangen gebeurtenis van Gewijzigd het Fragment van de Inhoud type is.

    async function needsAEMCallback(aemEvent) {
    // create a Logger
    const logger = Core.Logger('eventValidator', {
        level: 'info',
    });
    
    let isValid = false;
    
    // verify the event is a Content Fragment Modified event
    if (
        aemEvent
        && aemEvent.ContentType === 'contentFragment'
        && aemEvent.EventName === 'modified'
    ) {
        logger.info('Processing Content Fragment Modified Event');
        isValid = true;
    }
    
    return isValid;
    }
    
    module.exports = needsAEMCallback;
    
  • De module src/dx-excshell-1/actions/aem-event-processor/loadEventDetailsFromAEM.js roept de AEM-auteurservice op om de wijzigingsdetails te zoeken.

    ...
    const auth = require('@adobe/jwt-auth');
    ...
    // Get AEM Service Credentials aka Technical Account details.
    // These are passed to the action as params and added in .env file.
    const clientId = params.AEM_SERVICECREDENTIALS_TECHNICALACCOUNT_CLIENTID;
    const technicalAccountId = params.AEM_SERVICECREDENTIALS_ID;
    const orgId = params.AEM_SERVICECREDENTIALS_ORG;
    const clientSecret = params.AEM_SERVICECREDENTIALS_TECHNICALACCOUNT_CLIENTSECRET;
    // Private key is passed as a string with \n and \r characters escaped.
    const privateKey = params.AEM_SERVICECREDENTIALS_PRIVATEKEY.replace(
        /\\n/g,
        '\n',
    ).replace(/\\r/g, '\r');
    const metaScopes = params.AEM_SERVICECREDENTIALS_METASCOPES.split(',');
    const ims = `https://${params.AEM_SERVICECREDENTIALS_IMSENDPOINT}`;
    
    // Get the access token from IMS using Adobe I/O SDK
    const { access_token } = await auth({
        clientId,
        technicalAccountId,
        orgId,
        clientSecret,
        privateKey,
        metaScopes,
        ims,
    });
    ...
    // Call AEM Author service to get the CF details using AEM Assets API
    const res = await fetch(
        `${aemAuthorHost}${cfPath.replace('/content/dam/', '/api/assets/')}.json`,
    {
      method: 'GET',
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Bearer ${access_token}`,
      },
    },
    );
    
    let newValuesOfCFPropertiesAddedOrModified = {};
    // If the response is OK, get the values of the CF properties that were added or modified
    if (res.ok) {
        logger.info('AEM Event Details loaded from AEM Author instance');
        const responseJSON = await res.json();
    
        // Get the values of the CF properties that were added or modified
        if (
        responseJSON
        && responseJSON.properties
        && responseJSON.properties.elements
        ) {
        const allCurrentCFProperties = responseJSON.properties.elements;
    
        newValuesOfCFPropertiesAddedOrModified = cfPropertiesAddedOrModified.map(
            (key) => ({
            key,
            value: allCurrentCFProperties[key],
            }),
        );
        }
    }
    ...
    

    Verwijs naar zelfstudie van de Referenties van de Dienst van AEMom meer over het te leren. Ook, de Dossiers van de Configuratie van App Buildervoor het beheren van geheimen en actieparameters.

  • In de module src/dx-excshell-1/actions/aem-event-processor/storeEventData.js worden de oorspronkelijke gebeurtenisgegevens, het activiteitenbericht en eventuele wijzigingsgegevens opgeslagen in Adobe I/O Runtime.

    ...
    const filesLib = require('@adobe/aio-lib-files');
    ...
    
    const files = await filesLib.init();
    
    const eventDataAsJSON = JSON.stringify({
        activity: activityMessage,
        aemEvent,
        aemEventDetails,
    });
    
    // store details in a folder named YYYY-MM-DD and a file named <eventID>.json
    const bytesWritten = await files.write(
        `${formattedDate}/${aemEvent.getEventID()}.json`,
        eventDataAsJSON,
    );
    ...
    

Handelingscode bijwerken

Werk ten slotte de actiecode bij in src/dx-excshell-1/actions/aem-event-processor/index.js om de ontwikkelde modules te gebruiken.

...
// handle the challenge probe request, they are sent by I/O to verify the action is valid
if (params.challenge) {
    logger.info('Challenge probe request detected');
    responseMsg = JSON.stringify({ challenge: params.challenge });
} else {
    logger.info('AEM Event request received');

    // create AEM Event object from request parameters
    const aemEvent = new AEMEvent(params);

    // get AEM Event as activity message using the helper method
    const activityMessage = aemEvent.getEventAsActivityMessage();

    // determine if AEM Event requires callback to AEM Author service
    const callbackAEMForEventDetails = await needsAEMCallback(aemEvent);

    let eventDetails = {};
    if (callbackAEMForEventDetails) {
    // call AEM Author service to get specifics about the event
    eventDetails = await loadEventDetailsFromAEMAuthorService(
        aemEvent,
        params,
    );
    }

    // store AEM Event and Event details in the file system
    const storageDetails = await storeEventData(
    activityMessage,
    aemEvent,
    eventDetails || {},
    );
    logger.info(`Storage details: ${JSON.stringify(storageDetails)}`);

    // create response message
    responseMsg = JSON.stringify({
    message: 'AEM Event processed',
    activityMessage,
    });

    // response object
    const response = {
    statusCode: 200,
    body: responseMsg,
    };
    logger.info('Adobe I/O Runtime action response', response);

    // Return the response to the caller
    return response;
}
...

Aanvullende bronnen

  • De map src/dx-excshell-1/actions/model bevat aemEvent.js - en errors.js -bestanden, die door de handeling worden gebruikt om respectievelijk de ontvangen gebeurtenis te parseren en fouten af te handelen.
  • De map src/dx-excshell-1/actions/load-processed-aem-events bevat actiecode. Deze handeling wordt door de SPA gebruikt om de verwerkte AEM-gebeurtenissen te laden vanuit de Adobe I/O Runtime-opslag.
  • De map src/dx-excshell-1/web-src bevat de SPA-code waarmee de verwerkte AEM Events wordt weergegeven.
  • Het bestand src/dx-excshell-1/ext.config.yaml bevat actieconfiguratie en parameters.

Concept en toetsaanslagen

De vereisten voor gebeurtenisverwerking verschillen van project tot project, maar de belangrijkste taken in dit voorbeeld zijn:

  • De gebeurtenisverwerking kan worden uitgevoerd met Adobe I/O Runtime Action.
  • De Runtime Actie kan met systemen zoals uw interne toepassingen, derdeoplossingen, en de oplossingen van Adobe communiceren.
  • De runtimeactie dient als ingangspunt voor een bedrijfsproces dat rond een inhoudsverandering wordt ontworpen.
recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69