Azure Mobile Services で別の Server Script を参照 (Refer) する


Azure Mobile App のあれこれ

こんにちは。

アイデンティティ・シリーズの最終回である「Build Insider : Windows Azure の認証におけるその他サービス ~ Windows Azureモバイル・サービス、多要素認証」が公開されました。
皆さん、このシリーズがあったこと忘れてましたよね。私も、この記事を以前書いていたことを、つい忘れてました。私のレビューが超遅れたこともあり、執筆してから数か月後の公開となり、もう古い情報になってしまいました。
技術情報は鮮度が命なんですが、申し訳ありません ! (執筆原稿に「リリースしたばかりの・・・」などの記述もあったのですが、昨日全部削除しました。一色編集長、いつもいつも、すみません!)

さて、昨日読み直して思い出しましたが、紙面上の関係でいくつか解説を省略してますので、補足したいと思います。

まず、Azure Mobile App (旧 Azure Mobile Service) のサーバー・スクリプトについてです。
記事ではサーバー・スクリプトを使用すると、さまざまな応用が可能であることを解説しています。これらの「技」については、このブログでは解説しませんが、利用する上での大事な手法として、Script Source の参照 (refer) も可能です。複雑な処理、共通の処理などは、モジュールにわけて再利用できますので、実際の開発においては、是非活用してください。

手順は、以下の通りです。(結論を書くと、ソース管理の機能を使用します。もちろん、この機能を使って、バックアップなど、ソース管理自体に応用できます。)

まず準備として、Azure Mobile App のダッシュボードを表示して、下図の [ソース管理の設定] (Set up source control) をクリックします。クリックをおこない、認証設定などの必要な構成をおこなうと、Git を使ったソース管理が可能になります。
完了後、上部の [構成] をクリックすると、Git の Url を取得できます。

開発をおこなうローカル環境に Git (msysgit など) をインストールして、Git Bash などを使って pull、push など (ソースのダウンロードや更新など) をおこえます。
例えば、下図は、Azure Mobile App から、サーバー・スクリプトを含む関連するソース一式をすべて取得します。(下記の https://tsmatsuz-mob01.scm.azure-mobile.net/tsmatsuz-mob01.git は、私の環境の Git Url です。)

一度、サーバー・スクリプト (テーブルのトリガー・スクリプト) の編集をおこなっていると、service\table サブフォルダーに編集したサーバー・スクリプト (トリガー・スクリプト) がダウンロードされているのが確認できます。例えば、TestTbl の insert スクリプトを編集した場合には、「testtbl.insert.js」という名前のファイルがダウンロードされているはずです。
いま、「Build Insider : Windows Azure の認証におけるその他サービス ~ Windows Azureモバイル・サービス、多要素認証」で紹介したように、以下のようなスクリプトが、この testtbl.insert.js に記述されていると仮定します。ここでは、UserTbl の内容を見て、利用者 (ユーザー) がここに登録されている場合のみデータの挿入を許可しています。

function insert(item, user, request) {
  var usertbl = tables.getTable('UserTbl');
  usertbl.where({ userid : user.userId }).read({
    success: function(results) {
      if (results.length === 0) {
        request.respond(401, 'User is not registered');
      }
      else {
        request.execute();
      }
    },
    error: function(err) {
      request.respond(401, 'User validation failed');
    }
  });
}

では、このユーザー確認の処理を、共通の function として Script ファイルに分離し、その Script Source を参照 (refer) してみましょう。

まず、service\shared に users.js という名前のテキスト ファイルを新規作成します。このファイルに、下記の通り function を作成しましょう。

exports.usercheck = function(
  user, tableset, success_callback, error_callback) {
  console.log('function called'); // debug
  var usertbl = tableset.getTable('UserTbl');
  usertbl.where({ userid : user }).read({
    success: function(results) {
      if (results.length === 0) {
        error_callback({ status: 401, message: 'User is not registered' });
      }
      else {
        success_callback();
      }
    },
    error: function(err) {
      error_callback({ status: 401, message: 'User validation failed' });
    }
  });
};

上記の usercheck 関数は、IO 処理のため非同期 (asynchronous) の処理になっていますが、もちろん、下記のような return (返り値) を持つ単純な同期関数も実装できます。(というか、このほうが一般的ですね。)

補足 : JavaScript の IO 処理は、必ず非同期がベースとなります。C# のように同期で実装することはできず、むしろ、制約により、最適なプログラミングを強制します。(サーバー・サイドにおける非同期プログラミングの効果と意義については、「ASP.NET で非同期 (Async) を乗りこなす」を参照してください。)

exports.addtest = function(a, b) { return a + b; };

さて、上記の関数 (usercheck) を使用するサーバー・スクリプト側は、以下の通り記述します。今回は、service\table\testtbl.insert.js から使用するサンプルです。
このプログラムのポイントは、require 関数を使用したスクリプトの動的参照です。

function insert(item, user, request) {
  var userModule = require('../shared/users.js');
  userModule.usercheck(user.userId, tables,
    function() {
      request.execute();
    },
    function(err) {
      request.respond(err.status, err.message);
    });
}

以上で完了です。

あとは、git bash を使って、下記の通り、変更されたソースコードを Azure Mobile App に push します。

git add .
git commit -m "function test"
git push origin master

 

今回は、カスタムな function を作成して再利用しましたが、「Microsoft Azure : Store server scripts in source control」にも記載されている通り、require を使用して Node.js modules (Node.js モジュール) をインストールして参照することも可能です。(ただし、http や https を使用した外部スクリプトの参照はできないようです。)

便利なサーバー・スクリプトですが、あとは、デバッグが簡単になると良いですね …

 

※ 変更履歴

2015/03/26  Azure Mobile Service から Azure Mobile App に名称変更

Comments (0)

Skip to main content