操作にトリガーを追加する
トリガーは、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 つ目の項目を作成することです。 sourceId、 categoryId、 displayName。
{
"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;
}