操作にトリガーを追加する

完了

トリガーは、Azure Cosmos DB for NoSQL が操作の前と後の両方でビジネス ロジックを挿入できる主要な方法です。 トリガーはコンテナー内に格納されているリソースであり、そのコードはストアド プロシージャやユーザー定義関数と同様に JavaScript で記述されます。

トリガーは JavaScript 関数として定義されます。 その後、トリガーが呼び出されると、関数が実行されます。

function name() {
}

関数内で、getContext() メソッドはコンテキスト オブジェクトを取得します。このオブジェクトを使用して、次の複数のアクションを実行できます。

  • HTTP 要求オブジェクト (事前トリガーのソース) にアクセスする

  • HTTP 応答オブジェクト (事後トリガーのソース) にアクセスする

  • 対応する Azure Cosmos DB for NoSQL コンテナーにアクセスする

コンテキスト オブジェクトを使用すると、getRequest() または getResponse() メソッドを呼び出して、HTTP 要求オブジェクトと応答オブジェクトにアクセスできます。 getCollection() メソッドを呼び出し、JavaScript クエリ API を使用してコンテナーにアクセスすることもできます。

プレトリガー

事前トリガーは操作の前に実行され、入力パラメーターを使用することはできません。 項目のプロパティの検証や、不足しているプロパティの挿入などのアクションを実行できます。

JSON 項目をコンテナーに作成する準備ができている簡単な例について説明します。

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

この例では、HTTP POST 操作の前に実行される事前トリガーが作成されます。 このトリガーは、 ラベル プロパティの存在を確認します。 存在しない場合は、 値が new の label プロパティが追加されます。 この関数の JavaScript コードでは、getContext() および getRequest() メソッドを使用して現在の HTTP 要求を取得し、次に要求本文を取得します。

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

最後に、関数は ラベル プロパティの存在を確認し、存在しない場合は追加し、更新された要求本文として変更された項目を返します。

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

request.setBody(pendingItem);

最後の事前トリガー関数には、次のコードが含まれます。

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

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

    request.setBody(pendingItem);
}

この事前トリガーを使用して作成操作を呼び出す場合は、トリガー内のロジックのおかげで、結果の JSON に ラベル プロパティが含まれると想定する必要があります。

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

ポストトリガー

事後トリガーは操作が完了した後に実行され、必要ではない場合でも入力パラメーターを持つ場合があります。 クライアントに送信される直前に、HTTP 応答メッセージに対してアクションを実行します。 元の項目に対する変更に基づいて、セカンダリ項目の更新や作成などのアクションを実行できます。

同じ JSON ファイルで少し異なる例を見てみましょう。 ここで、事後トリガーを使用して、別のデータの具体化されたビューを持つ 2 つ目の項目を作成します。 この目標は、3 つの JSON プロパティを持つ 2 つ目の項目を作成することです。 sourceIdcategoryIddisplayName

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

注意

post-trigger 内で作成されたすべての項目は、トリガーのソースであった元の項目と同じ論理パーティション キーを持つ必要があるため、 categoryId プロパティが含まれています。

getCollection() メソッドと getResponse() メソッドを使用してコンテナーと HTTP 応答の両方を取得することで、関数を開始できます。 また、HTTP 応答オブジェクトの getBody() メソッドを使用して、新しく作成された項目を取得します。

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

新しく作成された項目のさまざまなプロパティを使用して、新しい JavaScript オブジェクトを構築できます。

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

次に、 createDocument メソッドを使用してビューから新しい項目を作成し、エラーやタイムアウトがある場合はスローまたは返すことができます。

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

最後の事後トリガー関数には、次のコードが含まれます。

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;
}