Triggers toevoegen aan een bewerking

Voltooid

Triggers zijn de belangrijkste manier waarop Azure Cosmos DB for NoSQL bedrijfslogica kan injecteren, zowel vóór als na bewerkingen. Triggers zijn resources die zijn opgeslagen in een container en hun code wordt geschreven in JavaScript, net zoals opgeslagen procedures en door de gebruiker gedefinieerde functies.

Triggers worden gedefinieerd als JavaScript-functies. De functie wordt vervolgens uitgevoerd wanneer de trigger wordt aangeroepen.

function name() {
}

Binnen de functie haalt de getContext() methode een contextobject op, dat kan worden gebruikt om meerdere acties uit te voeren, waaronder:

  • Toegang tot het HTTP-aanvraagobject (de bron van een pre-trigger)

  • Het HTTP-antwoordobject openen (de bron van een post-trigger)

  • Toegang tot de bijbehorende Azure Cosmos DB for NoSQL-container

Met behulp van het contextobject kunt u de getRequest() of getResponse() methoden aanroepen om toegang te krijgen tot de HTTP-aanvraag- en antwoordobjecten. U kunt de getCollection() methode ook aanroepen voor toegang tot de container met behulp van de JavaScript-query-API.

Voorafgaande trigger

Pretriggers worden uitgevoerd vóór een bewerking en kunnen geen invoerparameters hebben. Ze kunnen acties uitvoeren zoals het valideren van de eigenschappen van een item of het injecteren van ontbrekende eigenschappen.

Laten we een eenvoudig voorbeeld bekijken waarin een JSON-item gereed is om te worden gemaakt in een container.

{
  "id": "caab0e5e-c037-48a4-a760-140497d19452",
  "name": "Handlebar",
  "categoryId": "e89a34d2-47ee-4da8-bcf6-10f552604b79",
  "categoryName": "Accessories",
  "price": 50
}

In dit voorbeeld wordt een pretrigger gemaakt die wordt uitgevoerd vóór een HTTP POST-bewerking. Met deze trigger wordt gecontroleerd op het bestaan van een labeleigenschap . Als deze niet bestaat, wordt de labeleigenschap toegevoegd met een nieuwe waarde. De JavaScript-code voor deze functie gebruikt de getContext() en getRequest() methoden om de huidige HTTP-aanvraag op te halen en vervolgens de aanvraagbody.

function addLabel() {
    var context = getContext();
    var request = context.getRequest();
    
    var pendingItem = request.getBody();
}

Ten slotte controleert de functie op het bestaan van de labeleigenschap , voegt u deze toe als deze niet bestaat en retourneert u vervolgens het gewijzigde item als de bijgewerkte aanvraagbody.

if (!('label' in pendingItem))
    pendingItem['label'] = 'new';

request.setBody(pendingItem);

De laatste functie vóór de trigger bevat de volgende code:

function addLabel() {
    var context = getContext();
    var request = context.getRequest();
    
    var pendingItem = request.getBody();

    if (!('label' in pendingItem))
        pendingItem['label'] = 'new';

    request.setBody(pendingItem);
}

Als u de maakbewerking aanroept met behulp van deze pretrigger, moet u verwachten dat de resulterende JSON de labeleigenschap opneemt dankzij de logica in de trigger.

{
  "id": "caab0e5e-c037-48a4-a760-140497d19452",
  "name": "Handlebar",
  "categoryId": "e89a34d2-47ee-4da8-bcf6-10f552604b79",
  "categoryName": "Accessories",
  "price": 50,
  "label": "new"
}

Na de trigger

Post-triggers worden uitgevoerd nadat een bewerking is voltooid en kunnen invoerparameters hebben, ook al zijn ze niet vereist. Ze voeren acties uit op het HTTP-antwoordbericht direct voordat het naar de client wordt verzonden. Ze kunnen acties uitvoeren zoals het bijwerken of maken van secundaire items op basis van wijzigingen in het oorspronkelijke item.

Laten we een iets ander voorbeeld bekijken met hetzelfde JSON-bestand. Nu wordt een posttrigger gebruikt om een tweede item te maken met een andere gerealiseerde weergave van onze gegevens. Ons doel is om een tweede item met drie JSON-eigenschappen te maken; sourceId, categoryId en displayName.

{
  "sourceId": "caab0e5e-c037-48a4-a760-140497d19452",
  "categoryId": "e89a34d2-47ee-4da8-bcf6-10f552604b79",
  "displayName": "Handlebar [Accessories]",
}

Notitie

We zijn inclusief de eigenschap categoryId , omdat alle items die zijn gemaakt in een post-trigger dezelfde logische partitiesleutel moeten hebben als het oorspronkelijke item dat de bron van de trigger was.

We kunnen onze functie starten door zowel de container als het HTTP-antwoord op te halen met behulp van de methoden getCollection() en getResponse( ). We krijgen ook het zojuist gemaakte item met behulp van de methode getBody() van het HTTP-antwoordobject.

function createView() {
    var context = getContext();
    var container = context.getCollection();
    var response = context.getResponse();
    
    var createdItem = response.getBody();
}

Met behulp van de verschillende eigenschappen van ons zojuist gemaakte item kunnen we een nieuw JavaScript-object maken.

var viewItem = {
    sourceId: createdItem.id,
    categoryId: createdItem.categoryId,
    displayName: `${createdItem.name} [${createdItem.categoryName}]`
};

Vervolgens kunnen we de methode createDocument gebruiken om een nieuw item te maken vanuit onze weergave en vervolgens genereren of retourneren als er fouten of time-outs zijn.

var accepted = container.createDocument(
    container.getSelfLink(),
    viewItem,
    (error, newItem) => {
        if (error) throw error;
    }
);
if (!accepted) return;

De laatste functie na de trigger bevat de volgende code:

function createView() {
    var context = getContext();
    var container = context.getCollection();
    var response = context.getResponse();
    
    var createdItem = response.getBody();
    
    var viewItem = {
        sourceId: createdItem.id,
        categoryId: createdItem.categoryId,
        displayName: `${createdItem.name} [${createdItem.categoryName}]`
    };
 
    var accepted = container.createDocument(
        container.getSelfLink(),
        viewItem,
        (error, newItem) => {
            if (error) throw error;
        }
    );
    if (!accepted) return;
}