6.5.2 サーバーサイドスクリプト

サーバーサイドスクリプトは、サーバー上で実行されます。
以下について説明します。

(1)サポート対象の文法・関数

Ops Iのサーバーサイドで動作するJavaScriptは、ECMAScript 5(ES5)をサポートします。さらに、ES5に加えて以下の文法や関数もサポートします。

  • 変数宣言
    • let/const
  • 関数・クラス関連
    • アロー関数(const f = () => {})
    • デフォルト引数(function f(a = 1) {})
    • レストパラメータ(function f(…args) {})
    • クラス構文(class、constructor、extends、super)
    • ジェネレーター関数とyield(function* () {})
  • オブジェクト・配列操作
    • プロパティの短縮記法({a, b})
    • メソッドの短縮記法({ f() {} })
    • 計算されたプロパティ名({[propName]: value})
    • スプレッド演算子(…array, …obj)
    • Restプロパティ
    • 分割代入(const {a, b} = obj, const [x, y] = arr)
  • 制御フロー・反復
    • for…ofループ
    • try…catchのcatchバインド省略
  • 演算子
    • オプショナルチェイニング(?.)
    • Null合体演算子(??)
    • 論理代入演算子(&&=, ||=, ??=)
    • べき乗演算子(**)
  • その他
    • テンプレートリテラル(複数行・埋め込み・タグ付きテンプレート)
    • バイナリ・8進数リテラル(0b1010、0o755)
    • 数値区切り文字(Numeric Separators: 1_000_000)
  • 組み込みオブジェクトのメソッド
    • Object
      • 静的メソッド
        • Object.assign()
        • Object.values()
        • Object.entries()
        • Object.setPrototypeOf()
    • Array
      • 静的メソッド
        • Array.from()
        • Array.of()
      • プロトタイプメソッド
        • Array.prototype.find()
        • Array.prototype.findIndex()
        • Array.prototype.includes()
        • Array.prototype.flat()
        • Array.prototype.flatMap()
        • Array.prototype.at()
    • String
      • プロトタイプメソッド
        • String.prototype.startsWith()
        • String.prototype.endsWith()
        • String.prototype.includes()
        • String.prototype.repeat()
        • String.prototype.matchAll()
        • String.prototype.replaceAll()
    • RegExp
      • 正規表現
        • /u
        • /y
        • /s
    • Number
      • 静的メソッド
        • Number.isNaN()
        • Number.isFinite()
        • Number.isInteger()
        • Number.isSafeInteger()
        • Number.parseFloat()
        • Number.parseInt()
  • 組み込みオブジェクト
    • Map
    • Set


(2)サーバーサイドスクリプトの実行ログ

スクリプトの実行結果はログで確認できます。ログを確認することで、ユーザーが作成したサーバーサイドスクリプトのデバッグや動作確認ができます。ログを確認するには、Primitiveロール「script_logs_viewer」が割り当てられている必要があります。Primitiveロールの詳細は「Ops I上のロールとサポート機能の対応関係」を参照してください。
ログはダッシュボードアプリケーションで確認できます。詳細は「ダッシュボード」を参照してください。
ログはAPI「GET /api/v1/script-logs」でも取得できます。APIの詳細は「JP1 Cloud Service 運用統合 APIリファレンス」の「APIリファレンス詳細>標準提供API>標準提供API(v1)」のscript-logsを参照してください。

ログはユーザーが設定することでOILogにより出力されます。OILogについての詳細は「OILog」を参照してください。
また、ビジネスロジックトリガーの実行結果に関しては、ユーザーが設定することなくデフォルトで出力されるログがあります。詳細は「ビジネスロジックトリガーの実行ログ」を参照してください。


【OILogのログ出力】

OILogによって出力されるログの内容は以下の通りです。

(表)ログの内容

項目 説明
ID ログレコードのID
Run ID サーバーサイドのスクリプト実行ごとに設定されるID
同一の実行かどうかを識別するために使用する。実行IDが同じ場合、同一の実行であることを示す。
Date time ログ出力した日時
Log level ログのレベル
"ERROR"、"WARN"、"INFO"、"DEBUG"のいずれかが出力される。
ただし、BusinessLogicTriggerのマニフェストファイルで"script.logLevel"に指定されたレベルより低いログは出力されない。
ログレベル(高い順):ERROR>WARN>INFO>DEBUG
Caller kind 呼び出し元のマニフェストファイルの"kind"
Caller name 呼び出し元のマニフェストファイルの"name"
Message メッセージ

【大量のログ出力によりログ出力が抑止された場合のログ】

一度のスクリプト実行でログ出力が1,000回を超えた場合、大量のログが出力されたことを示すログを出力し、1,000回目以降のログは出力されません。
ただし、ビジネスロジックトリガーの終了時のログおよびエラー終了時のログは1,000回目以降であっても出力されます。ビジネスロジックトリガーのログについては「ビジネスロジックトリガーの実行ログ」を参照してください。

出力されるログの内容は以下の通りです。

(表)大量のログ出力によりログ出力が抑止された場合のログの内容

項目 説明
ID ログレコードのID
Run ID サーバーサイドのスクリプト実行ごとに設定されるID
同一の実行かどうかを識別するために使用する。実行IDが同じの場合、同一の実行であることを示す。
Date time ログ出力した日時
Log level "ERROR"が出力される。
Caller kind 呼び出し元のマニフェストファイルの"kind"
Caller name 呼び出し元のマニフェストファイルの"name"
Message 次のメッセージが出力される。

[ServerSideScriptLogHasBeenSuppressed] Log output has been suppressed due to exceeding log output limit.

注意事項注意事項

  • 出力されたログは14日間だけ保存されます。14日より前のログは削除されます。
  • ログにアクセスできる権限を持つユーザーは、すべてのログを参照できます。個人情報や機密情報は出力しないでください。



(3)使用可能なグローバルオブジェクト

以下に、サーバーサイドスクリプトで使用可能なグローバルオブジェクトの一覧を示します。

(表)使用可能なグローバルオブジェクトとメソッド一覧(サーバーサイド)

オブジェクト名 メソッド名 説明
OILog log ログを出力する。
debug ログレベル"DEBUG"でログを出力する。
info ログレベル"INFO"でログを出力する。
warn ログレベル"WARN"でログを出力する。
error ログレベル"ERROR"でログを出力する。
OIHttpClient get 指定されたURLに対して、GETメソッドでHTTPリクエストを送信し、レスポンスを取得する。
post 指定されたURLに対して、POSTメソッドでHTTPリクエストを送信し、レスポンスを取得する。
put 指定されたURLに対して、PUTメソッドでHTTPリクエストを送信し、レスポンスを取得する。
patch 指定されたURLに対して、PATCHメソッドでHTTPリクエストを送信し、レスポンスを取得する。
delete 指定されたURLに対して、DELETEメソッドでHTTPリクエストを送信し、レスポンスを取得する。
OISystem.properties get Scriptが実行されるシステムのプロパティを返却する。
getAll Scriptが実行されるシステムのプロパティをすべて返却する。
OIVault.kv.v2 get シークレット情報を取得する。

1. OILog

OILogオブジェクトのメソッドの詳細は以下の通りです。


(a)OILog.log

ログを出力します。
引数は下表の通りです。

(表)OILog.logの引数

データ形式 変数名 設定する値
string level ログレベルを指定する。
"ERROR"、"WARN"、"INFO"、"DEBUG"から指定する。不正な値が指定された場合、"INFO"が指定される。

ログレベル(高い順):ERROR>WARN>INFO>DEBUG
string message メッセージ

<戻り値>
戻り値はありません。


(b)OILog.debug

ログレベル"DEBUG"でログを出力します。
引数は下表の通りです。

(表)OILog.debugの引数

データ形式 変数名 設定する値
string message メッセージ

<戻り値>
戻り値はありません。


(c)OILog.info

ログレベル"INFO"でログを出力します。
引数は下表の通りです。

(表)OILog.infoの引数

データ形式 変数名 設定する値
string message メッセージ

<戻り値>
戻り値はありません。


(d)OILog.warn

ログレベル"WARN"でログを出力します。
引数は下表の通りです。

(表)OILog.warnの引数

データ形式 変数名 設定する値
string message メッセージ

<戻り値>
戻り値はありません。


(e)OILog.error

ログレベル"ERROR"でログを出力します。
引数は下表の通りです。

(表)OILog.errorの引数

データ形式 変数名 設定する値
string message メッセージ

<戻り値>
戻り値はありません。



2. OIHttpClient

OIHttpClientオブジェクトのメソッドの引数は下表の通りです。

(表)OIHttpClientオブジェクトのメソッドの引数

データ形式 変数名/キー 設定する値
string url リクエスト先のURL
"https://..."のような絶対URLで指定する。
Object config 追加設定
省略可能である。
Object query クエリパラメータのkeyとvalueのセット
keyは文字列、valueは文字列、数値、真偽値、配列のいずれかを指定可能である。valueは内部で文字列に変換され、クエリパラメータとして送信される。配列を指定した場合は、同一keyの複数パラメータとして展開される。
例)
{"page": 1,"limit": 10,"active": true,"ids": [1, 2, 3]} 上記を指定した場合、以下のクエリパラメータとして送信される。
?page=1&limit=10&active=true&ids=1&ids=2&ids=3

あらかじめURLにクエリパラメータが含まれている場合でも、指定されたクエリパラメータが追加される。同一keyが存在する場合は、複数のクエリパラメータとして送信される。
例)
URL:https://example.com/api?page=1
query:{"page": 2, "limit": 10}
上記の場合、以下のクエリパラメータとして送信される。
?page=1&page=2&limit=10
Object headers リクエストヘッダー
keyとvalueが文字列のJavaScriptオブジェクトで指定する。
例)
{"Content-Type": "application/json","Authorization": "Bearer xxxxx"}
Object | array | string | number | boolean data リクエストボディ
"config.requestType"または"data"に指定した値の型に応じて、JSONまたはテキストとして送信される。ArrayBufferおよびTypedArray(Uint8Arrayなど)は指定できない。
string requestType リクエストデータの解釈方法
"json"または"text"を指定する。
省略した場合は、"data"に指定された値の型から自動判定される。※1
string responseType レスポンスデータの解釈方法
"json"または"text"を指定する。
省略した場合は、レスポンスヘッダーの"Content-Type"から自動判定される。※2
Object auth Basic認証用の情報
"headers"で"Authorization"が指定されている場合でも、指定された内容で上書きされる。
string username Basic認証に使用するユーザー名とパスワード
"auth.username"と"auth.password"はセットで指定する。
例)
auth: { "username": "user1", "password": "password123" }

指定された値は、Basic認証ヘッダー(Authorization: Basic <base64(auth.username:auth.password)>)として自動生成され送信される。
string password
Object network ネットワーク設定の情報
number timeout コネクション確立前からレスポンス受信完了までのタイムアウト時間(ミリ秒単位)
省略した場合は、"300000"が指定される。
number maxRedirects 自動リダイレクトの最大追跡回数
"0"を指定した場合は、リダイレクトされない。
省略した場合は、"10"が指定される。
Object retry リトライ設定の情報
number count 通信失敗時(DNSエラーや接続エラーなどのネットワークエラー)の自動リトライ回数
HTTPステータスコード(404や429など)ではリトライされない。
省略した場合は、"0"(リトライなし)が指定される。
number wait リトライ間の初期待機時間(ミリ秒単位)
待機時間は固定ではなく、指数バックオフ方式によりリトライ回数に応じて増加し、ランダムな揺らぎを伴って決定される。(最大待機時間は2,000ミリ秒)
省略した場合は、"100"が指定される。
Object security セキュリティ設定の情報
boolean insecure SSL/TLS証明書の検証の有無
trueの場合、SSL/TLS証明書の検証をスキップ(自己署名証明書などを許容)する。
省略した場合は、"false"が指定される。
※1:以下の番号順に解釈方法が判定されます。ただし"data"に未対応のデータ型が含まれている場合、送信形式の判定は行われず、例外「OIInvalidArgumentError」が発生します。OIInvalidArgumentErrorの詳細は「例外」を参照してください。
  1. "config.requestType"で指定されている場合、値に応じて次のように扱います。
    • json:JSON
    • text:テキスト
  2. "config.requestType"で指定されていない場合、"data"のデータ型に応じて次のように扱います。
    • Object/array:JSON
    • string/number/boolean:テキスト

JSONとして扱う場合、以下の番号順に送信するデータが判定されます。
  1. "config.headers"の"Content-Type"が指定されていない場合、リクエストヘッダー(headers)に"Content-Type: application/json"が付与されます。
  2. リクエストボディ(data)の型がstringの場合、"JSON.parse()"が実行されます。実行に成功した場合、"data"に指定された値が送信されます。実行に失敗した場合、例外「OIInvalidArgumentError」が発生します。OIInvalidArgumentErrorの詳細は「例外」を参照してください。
  3. リクエストボディ(data)の型がstring以外の場合、JSON.stringify()の実行結果が送信されます。
テキストとして扱う場合、以下の番号順に送信するデータが判定されます。
  1. "config.headers"の"Content-Type"が指定されていない場合、リクエストヘッダー(headers)に"Content-Type: text/plain"が付与されます。
  2. リクエストボディ(data)の型がstringの場合、"data"に指定された値が送信されます。
  3. リクエストボディ(data)の型がnumberまたはbooleanの場合、"data"に指定された値が文字列に変換されて送信されます。
※2:以下の番号順に解釈方法が判定されます。
  1. レスポンスの"status"が204か205、またはレスポンスボディ(data)がない場合、戻り値の"data"はnullとなります。
  2. レスポンスの"status"が200番台以外の場合、テキストとして扱います。
  3. "config.responseType"で指定されている場合、値に応じて次のように扱います。
    • json:JSON
    • text:テキスト
  4. レスポンスヘッダー(headers)の"Content-Type"の値に応じて次のように扱います。
    • "Content-Type"が"application/json"を含む、または"+json"で終わるメディアタイプ:JSON
    • "Content-Type"が"text/*"("text/"で始まるメディアタイプ。例:"text/plain" 、"text/html"など):テキスト
    "Content-Type"にバイナリや未サポートの値が指定されている、または"Content-Type"が指定されていないなど、上記に該当しない場合、例外「OIHttpClientUnsupportedResponseError」が発生します。OIHttpClientUnsupportedResponseErrorの詳細は「例外」を参照してください。
    未サポートの"Content-Type"などをテキストとして扱いたい場合、"config.responseType"を指定してください。

JSONとして扱う場合、以下の番号順に処理が実行されます。
  1. "Content-Type"に"charset"が指定されている、かつ"charset=UTF-8"以外が指定されている場合、例外「OIHttpClientUnsupportedResponseError」が発生します。OIHttpClientUnsupportedResponseErrorの詳細は「例外」を参照してください。
  2. 上記以外の場合、レスポンスボディ(data)に対して"JSON.parse()"が実行されます。実行に失敗した場合、例外「OIHttpClientParseError」が発生します。OIHttpClientParseErrorの詳細は「例外」を参照してください。
テキストとして扱う場合、以下の番号順に処理が実行されます。
  1. "Content-Type"に"charset"が指定されている、かつ"charset=UTF-8"以外が指定されている場合、例外「OIHttpClientUnsupportedResponseError」が発生します。OIHttpClientUnsupportedResponseErrorの詳細は「例外」を参照してください。
  2. 上記以外の場合、レスポンスボディ(data)はUTF-8の文字列としてデコードされます。デコードした結果に文字化けが含まれる場合でも、そのまま文字列として返却されます。

OIHttpClientオブジェクトのメソッドの戻り値は下表の通りです。

(表)OIHttpClientオブジェクトのメソッドの戻り値

データ形式 キー 説明
Object ー レスポンスの情報
number | null status HTTPステータスコード(200や404など)
DNSエラーやタイムアウトなどのネットワークエラーや初期化失敗時は"null"が設定される。
string | null statusText HTTPステータス文字列("200 OK"など)
"status"が"null"の場合は、"null"が設定される。
Object headers レスポンスヘッダーのkeyとvalueのセット
keyには文字列、valueには文字列または文字列配列が設定される。レスポンスヘッダーが存在しない場合は、空オブジェクトが設定される。
同一keyのヘッダーが複数存在する場合は、valueは文字列配列として設定される。単一の場合は、文字列として設定される。
例)
{
  "content-type": "application/json",
  "set-cookie": [
    "sessionId=abc123; Path=/; HttpOnly",
    "theme=dark; Path=/"
  ]
}
Object | array | string | number | boolean | null data レスポンスボディ
リクエストの"config.requestType"の指定、またはレスポンスのヘッダーの"Content-Type"に応じて、適切な型に自動変換される。HTTPステータスコードが204か205、またはレスポンスボディが存在しない場合は、"null"が設定される。※
string | null error エラーメッセージ
タイムアウトや名前解決失敗、証明書エラーなどの通信エラーが発生した場合に格納される。正常にHTTP通信が行われた場合は、"null"が設定される。
※自動判定の仕組みは、「(表)OIHttpClientオブジェクトのメソッドの引数」の注釈※2を参照してください。

OIHttpClientオブジェクトでは、例外が発生する場合があります。発生する例外と原因は以下の通りです。

  • OIInvalidArgumentError
    • 引数の型が誤っている
      • "config.query"などのObjectのkeyまたはvalueの型が誤っている
      • "config.data"にArrayBufferおよびTypedArrayが指定されている
  • OIHttpClientParseError
    • レスポンスの"JSON.parse()"が失敗した
  • OIHttpClientUnsupportedResponseError
    • リクエスト時の"config.responseType"が未指定、かつレスポンスヘッダーの"Content-Type"が未サポートの値(バイナリ形式を示す"application/pdf"など)である
    • レスポンスヘッダー"Content-Type"に"charset"が指定されていて"charset=UTF-8"以外が指定されている

例外の詳細は「例外」を参照してください。

OIHttpClientオブジェクトのメソッドの詳細は以下の通りです。

(a)OIHttpClient.get

指定されたURLに対して、GETメソッドでHTTPリクエストを送信し、レスポンスを取得します。
引数は「(表)OIHttpClientオブジェクトのメソッドの引数」を参照してください。


<戻り値>
戻り値は「(表)OIHttpClientオブジェクトのメソッドの戻り値」を参照してください。


(b)OIHttpClient.post

指定されたURLに対して、POSTメソッドでHTTPリクエストを送信し、レスポンスを取得します。
引数は「(表)OIHttpClientオブジェクトのメソッドの引数」を参照してください。


<戻り値>
戻り値は「(表)OIHttpClientオブジェクトのメソッドの戻り値」を参照してください。


(c)OIHttpClient.put

指定されたURLに対して、PUTメソッドでHTTPリクエストを送信し、レスポンスを取得します。
引数は「(表)OIHttpClientオブジェクトのメソッドの引数」を参照してください。


<戻り値>
戻り値は「(表)OIHttpClientオブジェクトのメソッドの戻り値」を参照してください。


(d)OIHttpClient.patch

指定されたURLに対して、PATCHメソッドでHTTPリクエストを送信し、レスポンスを取得します。
引数は「(表)OIHttpClientオブジェクトのメソッドの引数」を参照してください。


<戻り値>
戻り値は「(表)OIHttpClientオブジェクトのメソッドの戻り値」を参照してください。


(e)OIHttpClient.delete

指定されたURLに対して、DELETEメソッドでHTTPリクエストを送信し、レスポンスを取得します。
引数は「(表)OIHttpClientオブジェクトのメソッドの引数」を参照してください。


<戻り値>
戻り値は「(表)OIHttpClientオブジェクトのメソッドの戻り値」を参照してください。



3. OISystem.properties

OISystem.propertiesオブジェクトのメソッドの詳細は以下の通りです。


(a)OISystem.properties.get

スクリプトが実行されるシステムのプロパティを取得します。
引数は下表の通りです。

(表)OISystem.properties.getの引数

データ形式 変数名 設定する値
string key 取得したい情報のキー※
※非サポートの"key"が指定された場合、例外「OIInvalidArgumentError」が発生します。OIInvalidArgumentErrorの詳細は「例外」を参照してください。

<戻り値>
戻り値は下表の通りです。

(表)OISystem.properties.getの戻り値

データ形式 説明
string 指定された"key"に対応する"value"

以下の"key"をサポートしています。

(表)OISystem.properties.get:指定できるキーと取得できる値

キー(key) 値(value)
domain スクリプトが実行されるOps I環境のドメイン

(b)OISystem.properties.getAll

スクリプトが実行されるシステムのプロパティをすべて取得します。
引数はありません。


<戻り値>
戻り値は下表の通りです。

(表)OISystem.properties.getAllの戻り値

データ形式 キー 説明
Object - アプリケーション設定を格納するオブジェクト
string domain スクリプトが実行されるOps I環境のドメイン


4. OIVault.kv.v2

OIVault.kv.v2オブジェクトでは、例外が発生する場合があります。発生する例外と原因は以下の通りです。

  • OIInvalidArgumentError
    • 引数のオブジェクトが存在しない
    • 引数のオブジェクトの中に必須フィールドが存在しない
    • 引数の型が誤っている
  • OINotFoundError
    • 指定されたシークレットエンジンが存在しない
    • 指定されたシークレットパスが存在しない
    • 指定されたバージョンのシークレットが存在しない
  • OIUnexpectedError
    • Vaultに接続できない

例外の詳細は「例外」を参照してください。

OIVault.kv.v2オブジェクトのメソッドの詳細は以下の通りです。


(a)OIVault.kv.v2.get

シークレット情報を取得します。
取得できるシークレットの"Secrets Engines"のバージョンは"2"のみです。
また、取得できる"mountPoint"は、"secrets"配下の情報のみです。
引数は下表の通りです。

(表)OIVault.kv.v2.getの引数

データ形式 変数名/キー 設定する値
Object config -
string secretPath シークレット情報が格納されている"Secrets Engines"のパス
string mountPoint ユーザーのシークレット情報が格納されているパス
number version 格納されているシークレット情報のバージョン
省略可能である。省略された場合は、最新のバージョンのシークレット情報を取得する。

<戻り値>
戻り値は下表の通りです。

(表)OIVault.kv.v2.getの戻り値

データ形式 キー 説明
Object data key-value形式でシークレット情報を返却する。
"key"が1つも存在しない場合は、空オブジェクトを返却する。
string (key) "key"に対応する"value"を返却する。



(4)例外

サーバーサイドスクリプトでは、例外が発生することがあります。
Ops I提供部品でエラーが発生した場合、以下の例外を発生する場合があります。

【例外の階層構造】

例外の階層を以下に示します。

Error
   └─ OIBaseError
          ├─ OIInvalidArgumentError
          ├─ OINotFoundError
          ├─ OIUnexpectedError
          └─ OIValueError
                 ├─ OIParseError
                 │     └─ OIHttpClientParseError
                 └─ OIUnsupportedValueError
                       └─ OIHttpClientUnsupportedResponseError

【例外の仕様】

例外の仕様を以下に示します。

(a)OIBaseError

Ops Iが提供するオブジェクトにより発生する例外の基底クラスです。
Javascript標準のErrorを継承します。

(表) OIBaseErrorで追加されるプロパティ

データ形式 プロパティ/キー 説明
string name エラーのクラス名(例:OIParseError)
string message エラーの詳細メッセージ
Object source エラーの発生元の情報
string componentName エラーが発生したオブジェクト名(例:OIVault)
string functionName エラーが発生した関数またはメソッド名(例:kv.v2.get)
(b)OIInvalidArgumentError

引数エラーにより発生する例外です。
OIBaseErrorを継承します。

OIInvalidArgumentErrorで追加されるプロパティはありません。

(c)OINotFoundError

指定されたリソースが見つからない場合に発生する例外です。
OIBaseErrorを継承します。

OINotFoundErrorで追加されるプロパティはありません。

(d)OIUnexpectedError

内部エラーにより発生する例外です。
OIBaseErrorを継承します。ユーザーによる対処が不可能、または予期しない場合に発生します。

OIUnexpectedErrorで追加されるプロパティはありません。

(e)OIValueError

値が不正の場合に発生する例外です。
OIBaseErrorを継承します。

OIValueErrorで追加されるプロパティはありません。

(f)OIParseError

構文エラーにより発生する例外です。
OIValueErrorを継承します。

OIParseErrorで追加されるプロパティはありません。

(g)OIHttpClientParseError

OIHttpClientクラスでHTTPレスポンスの"JSON.parse()“が失敗した場合に発生する例外です。
OIParseErrorを継承します。

(表) OIHttpClientParseErrorで追加されるプロパティ

データ形式 プロパティ/キー 説明
Object response エラー発生時のHTTPレスポンス情報
サーバーから返却された情報を確認できる。
number status HTTPステータスコード(例:200、404、500)
Object headers レスポンスヘッダーのkeyとvalueのセット
keyは文字列、valueは文字列または文字列配列が設定される。
レスポンスヘッダーが存在しない場合は、空のObjectが設定される。
同一keyのヘッダーが複数存在する場合は文字列配列、複数存在しない場合は文字列としてvalueが設定される。
string data サーバーから返却されたレスポンスボディ(文字列)
JSON以外の形式(HTMLなど)が返却された場合、解析が失敗した原因を確認できる。
string detail JSONファイルの解析時に発生した詳細なエラー内容
(h)OIUnsupportedValueError

未サポートの値を指定した場合に発生する例外です。
OIValueErrorを継承します。

OIUnsupportedValueErrorで追加されるプロパティはありません。

(i)OIHttpClientUnsupportedResponseError

OIHttpClientクラスでHTTPレスポンスが対応できない形式だった場合に発生する例外です。
OIUnsupportedValueErrorを継承します。

(表) OIHttpClientUnsupportedResponseErrorで追加されるプロパティ

データ形式 プロパティ/キー 説明
Object response エラー発生時のHTTPレスポンス情報
サーバーから返却された情報を確認できる。
number status HTTPステータスコード(例:200、404、500)
Object headers レスポンスヘッダーのkeyとvalueのセット
keyは文字列、valueは文字列または文字列配列が設定される。
レスポンスヘッダーが存在しない場合は、空のObjectが設定される。
同一keyのヘッダーが複数存在する場合は文字列配列、複数存在しない場合は文字列としてvalueが設定される。


(5)サーバーサイドスクリプト定義時の注意点

サーバーサイドスクリプト(ビジネスロジックトリガーなど)の実行条件に一致した場合、新しいJavaScript実行環境でスクリプトが実行されます。そのため、あるサーバーサイドスクリプトの実行中に定義した変数や関数などは、そのサーバーサイドスクリプトの実行内でのみ有効となります。他のサーバーサイドスクリプトの実行には影響しません。

また、Scriptのマニフェストファイルから、共通の処理などを記述した他のScriptのマニフェストファイルをInclude対象としてひもづけることで、Include対象のactionに定義されているJavaScriptファイルの内容を呼び出して実行することができます。これにより、Include元の1つのアクションに対して複数のJavaScriptファイルを実行することができます。その際、"includes"に定義した各JavaScriptファイルが順番に評価された後、エントリーポイント(ビジネスロジックトリガーの場合、executeTrigger())が実行されます。"includes"に定義したJavaScriptファイルとエントリーポイントを含むJavaScriptファイルは、同一の実行環境で評価されるため、あるファイルで定義した関数や変数などを他のファイルから参照できます。

スクリプト定義時には、複数のJavaScriptの利用に関して、以下の内容に注意してください。

① グローバルに定義する名前の競合を避ける
"includes"に定義したJavaScriptファイルとエントリーポイントを含むJavaScriptファイルは、同一の実行環境で評価されるため、異なるファイルで同じ名前の関数(function)や変数(var/let)、定数(const)、クラス(class)などを定義すると、後から評価されたファイルによって上書きされるおそれや、エラーになるおそれがあります。
グローバルに定義する名前には、JavaScriptファイルごとに固有の接頭辞を付与することを推奨します。なお、以下の例のようにファイル名を接頭辞とする場合、ファイルごとにファイル名を分けることを推奨します。
<誤った例>
common01.js

function createRequest() {

(中省略)

}

trigger_action01.js

function createRequest() {

(中省略)

}

<正しい例>
common01.js

function common01CreateRequest() {

(中省略)

}

trigger_action01.js

function triggerAction01CreateRequest() {

(中省略)

}


② ファイルのトップレベルに定義以外の処理を実装しない
IncludeされたJavaScriptファイルは、エントリーポイントの実行前に評価されます。そのため、ファイルのトップレベルに定義以外の処理を記述すると、エントリーポイントの実行前に実行されエラーになるおそれや、意図しない結果になるおそれがあります。
実行処理はエントリーポイント、またはエントリーポイントから呼び出す関数内に実装することを推奨します。
<誤った例>

// executeTrigger()実行前に評価・実行される。
// また、init_timeout()を定義したファイルが未評価の場合はエラーになる。
var timeout = init_timeout();
function executeTrigger(operation, record, extraInfo) {

(中省略)

}

<正しい例>

function executeTrigger(operation, record, extraInfo) {
  // executeTrigger()実行時に実行されるため、ファイル評価タイミングの影響を受けない。
  var timeout = init_timeout();
}


③ システム予約済みの名前(「OI」から始まる名前)を上書きしない
ビジネスロジックトリガーでは、「OI」から始まる名前がシステムにより予約されています。グローバルスコープで「OI」から始まる名前を定義または再代入すると、システムが提供する機能を上書きし、ビジネスロジックトリガーが正常に動作しなくなるおそれがあります。グローバルスコープでは、「OI」から始まる名前の関数や変数、定数、クラスなどを定義および再代入しないようにしてください。
<誤った例>

// システム提供のOIHttpClientを上書きしてしまう。
var OIHttpClient = {};
function executeTrigger(operation, record, extraInfo) {
  // OIHttpClientが正常に動作しない。
  OIHttpClient.patch(...);
}

<正しい例>

// OI以外から始まる名前で定義する。
var ticketHttpClient = {};
function executeTrigger(operation, record, extraInfo) {
  // システム提供の名前と競合せず、正常に動作する。
  OIHttpClient.patch(...);
}



(6)サーバーサイドスクリプトの定義例

<定義例>

function executeTrigger(operation, record, extraInfo) {
  try {
    var domain = OISystem.properties.get('domain');

    var secretData = OIVault.kv.v2.get({
      mountPoint: 'secrets/opsi',
      secretPath: 'user/business-logic-trigger',
    });
    var opsIToken = secretData.data.token;

    var url = 'https://' + domain + '/capi/v1/tickets/' + record.id;
    var res = OIHttpClient.get(url, {
      responseType: 'json',
      headers: {
        'X-OpsI-Token': opsIToken
      },
      network: { timeout: 5000 }
    });

    if (res.error || res.status == null) {
      OILog.error("ネットワーク通信エラーが発生しました。詳細: " + res.error);
    } else {
      if (res.status >= 200 && res.status < 300) {
        if (res.data === null) {
          OILog.warn("空のレスポンスを受信しました。");
        } else {
          var ticketData = res.data.data;
          // 取得したチケット情報を外部システムへ連携

(中省略)


        }
      } else {
        OILog.warn("サーバーエラーを受信しました。ステータス: " + res.status);
        OILog.warn("生のレスポンスボディ: " + res.data);
      }
    }

  } catch (e) {
    if (e instanceof OIBaseError) {
      OILog.error("[エラー箇所] " + e.source.componentName + ", " + e.source?.functionName);

      if (e instanceof OIInvalidArgumentError) {
        OILog.error("不正な引数が指定されました: " + e.message);
      } else if (e instanceof OINotFoundError) {
        OILog.error("指定されたリソースが見つかりません: " + e.message);
      } else if (e instanceof OIHttpClientParseError) {
        OILog.error("レスポンスのパース処理に失敗しました: " + e.message);
        OILog.error("ステータス: " + e.response.status);
        OILog.error("受信したレスポンス: " + e.response.data);
      } else if (e instanceof OIHttpClientUnsupportedResponseError) {
        OILog.error("サポートされていないレスポンス形式が検出されました: " + e.message);
        OILog.error("ステータス: " + e.response.status);
        OILog.error("受信したヘッダー: " + JSON.stringify(e.response.headers));
      } else if (e instanceof OIUnexpectedError) {
        OILog.error("予期しない内部エラーが発生しました: " + e.message);
      }
    } else {
      OILog.error("想定外の例外が発生しました: " + e);
    }
  }
}




節構成

6.5.2.1 ビジネスロジックトリガーのスクリプト