コンテンツにスキップ

インクルード

概要

拡張サーバスクリプトなどのサーバスクリプトの共通コードをインクルードする機能です。//Include命令をサーバスクリプトの任意の位置に記述して使用します。共通関数などを定義しておくことで、コードの一元管理が可能になります。

使用例

下記の例では Name が "ServerScriptName" の拡張サーバスクリプトを読み込み // Include を記述した位置に挿入します。
※事前に Name が "ServerScriptName" の拡張サーバスクリプトのファイル(JSON)を配置しておく必要があります。

//Include: ServerScriptName

サンプルコード

1. 複数のテーブルで使うロガーを、拡張サーバスクリプトとして1本のみ置く

複数のテーブルで使うロガーを、サーバの拡張サーバスクリプトとして1本のみ配置します。各テーブルのサーバスクリプトは//Include: commonLoggerの1行でロガーを読み込み、logger.info(...)のように呼び出します。ロガーを直すときは、サーバ上のファイルを1つ直せば、読み込んでいるすべてのテーブルに反映されます。

実務での使いどころ

同じテーブルの中で使う共通の処理には、コードの共有が使えます。ただし、共有はテーブル単位のため、テーブルが増えるとテーブルの数と同じ数のコピーができ、直すときはすべてのコピーを直す必要があります。インクルードを使うと、ロガーの本体はサーバ上に1つになり、テーブルが増えても直す場所は増えません。1つのテーブルで完結する処理は共有を使い、テーブルをまたいで使う段階でインクルードに移すのがおすすめです。

事前準備

1:サーバのApp_Data/Parameters/ExtendedServerScripts/に、次の2つのファイルを配置します。

ファイル 内容
commonLogger.json 拡張サーバスクリプトの設定。Nameが//Include:で指定する名前になる。実行条件はすべてfalseにする
commonLogger.json.js ロガーの本体。JSONファイルと同じ名前に.jsを付けたファイルに書くと、Bodyの代わりに読み込まれる

2:配置・変更のあとは、プリザンターを再起動してください。再起動するまで反映されません。

3:ロガーを使う各テーブルの「テーブルの管理 > サーバスクリプト」タブで、呼び出し側のスクリプトを登録します。

3-1:「新規作成」を選択する。
 3-2:タイトル: 任意の名前(例:includeCommonLogger)
 3-3:スクリプト: 下記サンプルコード「呼び出し側」を貼り付け
 3-4:条件: 「作成後」にチェック

JSON(commonLogger.json)
{
    "Name": "commonLogger",
    "Description": "複数テーブルで共有する汎用ロガー",
    "DeptIdList": null,
    "GroupIdList": null,
    "UserIdList": null,
    "SiteIdList": null,
    "IdList": null,
    "Controllers": null,
    "Actions": null,
    "WhenloadingSiteSettings": false,
    "WhenViewProcessing": false,
    "WhenloadingRecord": false,
    "BeforeFormula": false,
    "AfterFormula": false,
    "BeforeCreate": false,
    "AfterCreate": false,
    "BeforeUpdate": false,
    "AfterUpdate": false,
    "BeforeDelete": false,
    "BeforeBulkDelete": false,
    "AfterDelete": false,
    "AfterBulkDelete": false,
    "BeforeOpeningPage": false,
    "BeforeOpeningRow": false,
    "Shared": false,
    "Functionalize": false,
    "TryCatch": false,
    "Body": ""
}
JavaScript(commonLogger.json.js)
// ============================================================
// デバッグモード。true にすると debug() ログが出力される
// ============================================================
const DEBUG_MODE = false;
/**
 * 出力先の制御
 *   console : ブラウザ開発者ツールのコンソールに出力するか
 *   syslogs : システムログ(SysLogs テーブル)に出力するか
 */
const LOG_TARGET = {
    console: true,
    syslogs: true,
};
// ============================================================
// ロガー本体
// ============================================================
const logger = (function (debugMode, target) {
    /**
     * 内部共通出力関数
     * @param {Function} logFn   - logs オブジェクトのメソッド
     * @param {string}   message - ログメッセージ
     * @param {string}   method  - メソッド名(省略可)
     * @param {boolean}  forceOutput - デバッグモードに関係なく常に出力するか
     */
    function _write(logFn, message, method, forceOutput) {
        if (!forceOutput && !debugMode) return;
        const m = method || '';
        logFn(message, m, target.console, target.syslogs);
    }
    return {
        /**
         * デバッグログ(DEBUG_MODE=true のときのみ Info として出力)
         * @param {string} message
         * @param {string} [method]
         */
        debug: function (message, method) {
            _write(
                function (msg, mth, con, sys) {
                    logs.LogInfo(msg, mth, con, sys);
                },
                '[DEBUG] ' + message,
                method,
                false, // デバッグモード時のみ出力
            );
        },
        /**
         * 情報ログ(常に Info として出力)
         * @param {string} message
         * @param {string} [method]
         */
        info: function (message, method) {
            _write(
                function (msg, mth, con, sys) {
                    logs.LogInfo(msg, mth, con, sys);
                },
                message,
                method,
                true, // 常に出力
            );
        },
        /**
         * 警告ログ(常に Warning として出力)
         * @param {string} message
         * @param {string} [method]
         */
        warn: function (message, method) {
            _write(
                function (msg, mth, con, sys) {
                    logs.LogWarning(msg, mth, con, sys);
                },
                message,
                method,
                true,
            );
        },
        /**
         * ユーザエラーログ(常に UserError として出力)
         * @param {string} message
         * @param {string} [method]
         */
        userError: function (message, method) {
            _write(
                function (msg, mth, con, sys) {
                    logs.LogUserError(msg, mth, con, sys);
                },
                message,
                method,
                true,
            );
        },
        /**
         * システムエラーログ(常に SystemError として出力)
         * @param {string} message
         * @param {string} [method]
         */
        systemError: function (message, method) {
            _write(
                function (msg, mth, con, sys) {
                    logs.LogSystemError(msg, mth, con, sys);
                },
                message,
                method,
                true,
            );
        },
        /**
         * 例外ログ(常に Exception として出力)
         * catch ブロック内で利用する想定。
         * @param {Error|string} error   - Error オブジェクト、またはメッセージ文字列
         * @param {string}       [method]
         */
        exception: function (error, method) {
            var message;
            if (error && typeof error === 'object' && error.stack) {
                message = error.message + '\n' + error.stack;
            } else {
                message = String(error);
            }
            _write(
                function (msg, mth, con, sys) {
                    logs.LogException(msg, mth, con, sys);
                },
                message,
                method,
                true,
            );
        },
    };
})(DEBUG_MODE, LOG_TARGET);
JavaScript(呼び出し側)
//Include: commonLogger
logger.info('作成: ' + model.Title, 'onCreate');

注記

  • SiteIdList(およびDeptIdList・GroupIdList・UserIdList・IdList)で絞り込むと、拡張サーバスクリプトの実行に加えて、//Include:での読み込みも絞り込まれます。対象外のテーブルから//Include:すると、logger is not definedのエラーになります。複数のテーブルから使う場合は、絞り込みを指定しない(nullのまま)でください。
  • //Include:で指定するのはJSONのNameで、ファイル名ではありません。ファイル名とNameをそろえると管理しやすくなります。
  • 読み込んで使うための拡張サーバスクリプトは、実行条件をすべてfalseにしてください。trueの条件があると、//Include:していないテーブルでも、その条件で実行されます。
  • ロガーは、loggerをトップレベルで宣言しています。tryのブロックの中で宣言すると、呼び出し側から参照できません。

対応バージョン

対応バージョン 内容
1.1.37.0 以降 機能追加

関連情報