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()
- 静的メソッド
- Object
- 組み込みオブジェクト
- 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によって出力されるログの内容は以下の通りです。
| 項目 | 説明 |
|---|---|
| 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
ログを出力します。
引数は下表の通りです。
| データ形式 | 変数名 | 設定する値 | |
|---|---|---|---|
| string | level | ログレベルを指定する。 "ERROR"、"WARN"、"INFO"、"DEBUG"から指定する。不正な値が指定された場合、"INFO"が指定される。 ログレベル(高い順):ERROR>WARN>INFO>DEBUG |
|
| string | message | メッセージ | |
<戻り値>
戻り値はありません。
(b)OILog.debug
ログレベル"DEBUG"でログを出力します。
引数は下表の通りです。
| データ形式 | 変数名 | 設定する値 | |
|---|---|---|---|
| string | message | メッセージ | |
<戻り値>
戻り値はありません。
(c)OILog.info
ログレベル"INFO"でログを出力します。
引数は下表の通りです。
| データ形式 | 変数名 | 設定する値 | |
|---|---|---|---|
| string | message | メッセージ | |
<戻り値>
戻り値はありません。
(d)OILog.warn
ログレベル"WARN"でログを出力します。
引数は下表の通りです。
| データ形式 | 変数名 | 設定する値 | |
|---|---|---|---|
| string | message | メッセージ | |
<戻り値>
戻り値はありません。
(e)OILog.error
ログレベル"ERROR"でログを出力します。
引数は下表の通りです。
| データ形式 | 変数名 | 設定する値 | |
|---|---|---|---|
| string | message | メッセージ | |
<戻り値>
戻り値はありません。
2. 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"が指定される。 |
||
- "config.requestType"で指定されている場合、値に応じて次のように扱います。
- json:JSON
- text:テキスト
- "config.requestType"で指定されていない場合、"data"のデータ型に応じて次のように扱います。
- Object/array:JSON
- string/number/boolean:テキスト
JSONとして扱う場合、以下の番号順に送信するデータが判定されます。
- "config.headers"の"Content-Type"が指定されていない場合、リクエストヘッダー(headers)に"Content-Type: application/json"が付与されます。
- リクエストボディ(data)の型がstringの場合、"JSON.parse()"が実行されます。実行に成功した場合、"data"に指定された値が送信されます。実行に失敗した場合、例外「OIInvalidArgumentError」が発生します。OIInvalidArgumentErrorの詳細は「例外」を参照してください。
- リクエストボディ(data)の型がstring以外の場合、JSON.stringify()の実行結果が送信されます。
- "config.headers"の"Content-Type"が指定されていない場合、リクエストヘッダー(headers)に"Content-Type: text/plain"が付与されます。
- リクエストボディ(data)の型がstringの場合、"data"に指定された値が送信されます。
- リクエストボディ(data)の型がnumberまたはbooleanの場合、"data"に指定された値が文字列に変換されて送信されます。
- レスポンスの"status"が204か205、またはレスポンスボディ(data)がない場合、戻り値の"data"はnullとなります。
- レスポンスの"status"が200番台以外の場合、テキストとして扱います。
- "config.responseType"で指定されている場合、値に応じて次のように扱います。
- json:JSON
- text:テキスト
- レスポンスヘッダー(headers)の"Content-Type"の値に応じて次のように扱います。
- "Content-Type"が"application/json"を含む、または"+json"で終わるメディアタイプ:JSON
- "Content-Type"が"text/*"("text/"で始まるメディアタイプ。例:"text/plain" 、"text/html"など):テキスト
未サポートの"Content-Type"などをテキストとして扱いたい場合、"config.responseType"を指定してください。
JSONとして扱う場合、以下の番号順に処理が実行されます。
- "Content-Type"に"charset"が指定されている、かつ"charset=UTF-8"以外が指定されている場合、例外「OIHttpClientUnsupportedResponseError」が発生します。OIHttpClientUnsupportedResponseErrorの詳細は「例外」を参照してください。
- 上記以外の場合、レスポンスボディ(data)に対して"JSON.parse()"が実行されます。実行に失敗した場合、例外「OIHttpClientParseError」が発生します。OIHttpClientParseErrorの詳細は「例外」を参照してください。
- "Content-Type"に"charset"が指定されている、かつ"charset=UTF-8"以外が指定されている場合、例外「OIHttpClientUnsupportedResponseError」が発生します。OIHttpClientUnsupportedResponseErrorの詳細は「例外」を参照してください。
- 上記以外の場合、レスポンスボディ(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オブジェクトでは、例外が発生する場合があります。発生する例外と原因は以下の通りです。
- 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
スクリプトが実行されるシステムのプロパティを取得します。
引数は下表の通りです。
| データ形式 | 変数名 | 設定する値 | |
|---|---|---|---|
| string | key | 取得したい情報のキー※ | |
<戻り値>
戻り値は下表の通りです。
(表)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"配下の情報のみです。
引数は下表の通りです。
| データ形式 | 変数名/キー | 設定する値 | |
|---|---|---|---|
| Object | config | - | |
| string | secretPath | シークレット情報が格納されている"Secrets Engines"のパス | |
| string | mountPoint | ユーザーのシークレット情報が格納されているパス | |
| number | version | 格納されているシークレット情報のバージョン 省略可能である。省略された場合は、最新のバージョンのシークレット情報を取得する。 |
|
<戻り値>
戻り値は下表の通りです。
| データ形式 | キー | 説明 | |
|---|---|---|---|
| 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を継承します。
| データ形式 | プロパティ/キー | 説明 | |
|---|---|---|---|
| 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() {
(中省略)
}
function createRequest() {
(中省略)
}common01.js
function common01CreateRequest() {
(中省略)
}
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」から始まる名前の関数や変数、定数、クラスなどを定義および再代入しないようにしてください。
<誤った例>
// システム提供の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);
}
}
}
節構成