次の方法で共有


Mobile Apps Node.js SDK の使用方法

この記事では、Azure App Service の Mobile Apps 機能で Node.js バックエンドを操作する方法を示す詳細情報と例を示します。

はじめに

Mobile Apps には、モバイル最適化データ アクセス Web API を Web アプリケーションに追加する機能が用意されています。 Mobile Apps SDK は、ASP.NET および Node.js Web アプリケーション用に提供されています。 SDK には、次の操作が用意されています。

  • データ アクセスのテーブル操作 (読み取り、挿入、更新、削除)
  • カスタム API 操作

どちらの操作でも、Azure App Service で許可されているすべての ID プロバイダーで認証が提供されます。 これらのプロバイダーには、Facebook、Twitter、Google、Microsoft などのソーシャル ID プロバイダーと、エンタープライズ ID 用の Azure Active Directory が含まれます。

各ユース ケースのサンプルは 、GitHub の samples ディレクトリにあります

サポートされているプラットフォーム

Mobile Apps Node.js SDK では、Node 以降の現在の LTS リリースがサポートされています。 現在、最新の LTS バージョンは Node v4.5.0 です。 Node の他のバージョンは動作する可能性がありますが、サポートされていません。

Mobile Apps Node.js SDK では、次の 2 つのデータベース ドライバーがサポートされています。

  • node-mssql ドライバーは、Azure SQL Database とローカル SQL Server インスタンスをサポートします。
  • sqlite3 ドライバーは、1 つのインスタンスでのみ SQLite データベースをサポートします。

コマンド ラインを使用して基本的な Node.js バックエンドを作成する

すべての Mobile Apps Node.js バックエンドは、ExpressJS アプリケーションとして開始されます。 ExpressJS は、Node.jsで使用できる最も一般的な Web サービス フレームワークです。 基本的な Express アプリケーションは次のように作成できます。

  1. コマンドまたは PowerShell ウィンドウで、プロジェクトのディレクトリを作成します。

     mkdir basicapp
    
  2. npm initを実行してパッケージ構造を初期化します。

     cd basicapp
     npm init
    

    npm init コマンドは、プロジェクトを初期化するための一連の質問をします。 出力例を参照してください。

    npm init の出力

  3. npm リポジトリから express ライブラリと azure-mobile-apps ライブラリをインストールします。

     npm install --save express azure-mobile-apps
    
  4. 基本的なモバイル サーバーを実装する app.js ファイルを作成します。

    var express = require('express'),
        azureMobileApps = require('azure-mobile-apps');
    
    var app = express(),
        mobile = azureMobileApps();
    
    // Define a TodoItem table.
    mobile.tables.add('TodoItem');
    
    // Add the Mobile API so it is accessible as a Web API.
    app.use(mobile);
    
    // Start listening on HTTP.
    app.listen(process.env.PORT || 3000);
    

このアプリケーションは、動的スキーマを使用して基になる SQL データ ストアへの認証されていないアクセスを提供する単一のエンドポイント (/tables/TodoItem) を使用して、モバイル最適化 Web API を作成します。 これは、クライアント ライブラリのクイック スタートに従う場合に適しています。

この基本的なアプリケーションのコードは、 GitHub の basicapp サンプルにあります

Visual Studio 2015 を使用して Node.js バックエンドを作成する

Visual Studio 2015 では、IDE 内で Node.js アプリケーションを開発するための拡張機能が必要です。 まず、 Node.js Tools 1.1 for Visual Studio をインストールします。 インストールが完了したら、Express 4.x アプリケーションを作成します。

  1. [ 新しいプロジェクト ] ダイアログ ボックスを開きます ( ファイル>New>Project から)。

  2. テンプレート>JavaScript>Node.jsを展開します。

  3. [Basic Azure Node.js Express 4 アプリケーション] を選択します

  4. プロジェクト名を入力します。 [OK] を選択.

    Visual Studio 2015 の新しいプロジェクト

  5. npm ノードを右クリックし、[Install New npm packages]\(新しい npm パッケージのインストール\) を選択します。

  6. 最初の Node.js アプリケーションを作成した後、npm カタログを更新することが必要になる場合があります。 必要であれば、更新 を選択してください。

  7. 検索ボックスに 「azure-mobile-apps 」と入力します。 azure-mobile-apps 2.0.0 パッケージを選択し、[パッケージのインストール] を選択します。

    新しい npm パッケージをインストールする

  8. を選択してを閉じます。

  9. app.js ファイルを開き、Mobile Apps SDK のサポートを追加します。 ライブラリ require ステートメントの下部にある 6 行目に、次のコードを追加します。

    var bodyParser = require('body-parser');
    var azureMobileApps = require('azure-mobile-apps');
    

    他の app.use ステートメントの後の約 27 行目に、次のコードを追加します。

    app.use('/users', users);
    
    // Mobile Apps initialization
    var mobile = azureMobileApps();
    mobile.tables.add('TodoItem');
    app.use(mobile);
    

    ファイルを保存します。

  10. アプリケーションをローカルで実行するか (API は https://localhost:3000 で提供されます)、または Azure に発行します。

Azure portal を使用して Node.js バックエンドを作成する

Mobile Apps バックエンドは 、Azure portal で直接作成できます。 モバイル アプリの作成チュートリアルに従って、次の手順を実行するか、クライアントとサーバーを一緒 に作成 できます。 このチュートリアルには、これらの手順の簡略化されたバージョンが含まれており、概念実証プロジェクトに最適です。

  1. Azure portal でサインインします。

  2. [+NEW>Web + Mobile>Mobile App] を選択し、Mobile Apps バックエンドの名前を指定します。

  3. リソース グループの場合は、既存のリソース グループを選択するか、(アプリと同じ名前を使用して) 新しいリソース グループを作成します。

  4. App Service プランの場合、既定のプラン (Standard レベル) が選択されます。 別のプランを選択したり、 新しいプランを作成したりすることもできます。

    App Service プランの設定によって、アプリに関連付けられている 場所、機能、コスト、コンピューティング リソース が決まります。 App Service プランの詳細と、別の価格レベルと目的の場所で新しいプランを作成する方法については、 Azure App Service プランの詳細な概要を参照してください。

  5. を選択してを作成します。 この手順では、Mobile Apps バックエンドを作成します。

  6. 新しい Mobile Apps バックエンドの [設定] ウィンドウで、[クイック スタート] を選択>クライアント アプリ プラットフォーム>データベースを接続します。

    データベースを接続するための選択

  7. データ接続の追加 ペインで、SQL Database を選択して >。 データベース名を入力し、価格レベルを選択して、[サーバー] を選択 します。 この新しいデータベースは再利用できます。 同じ場所に既にデータベースがある場合は、代わりに [既存の データベースを使用] を選択できます。 帯域幅のコストと待機時間が長いため、別の場所でデータベースを使用することはお勧めしません。

    データベースの選択

  8. [ 新しいサーバー ] ウィンドウで、[ サーバー名 ] ボックスに一意のサーバー名を入力し、ログインとパスワードを入力し、[ Azure サービスによるサーバーへのアクセスを許可する] を選択して、[ OK] を選択します。 この手順では、新しいデータベースを作成します。

  9. [ データ接続の追加 ] ウィンドウに戻り、[ 接続文字列] を選択し、データベースのログインとパスワードの値を入力して、[ OK] を選択します

    続行する前に、データベースが正常にデプロイされるまで数分待ちます。

[ 作業の開始 ] ウィンドウに戻り、[ Create a table API]\(テーブル API の作成\) で、バックエンド言語として Node.js を選択します。 すべてのサイト コンテンツが上書きされることを私は認める ボックスを選択し、TodoItem テーブルを作成する を選択します。

Git を使用して Node.js バックエンド クイック スタート コード プロジェクトをダウンロードする

ポータルの クイック スタート ウィンドウを使用して Node.js Mobile Apps バックエンドを作成すると、Node.js プロジェクトが自動的に作成され、サイトに展開されます。 ポータルでは、テーブルと API を追加し、Node.js バックエンドのコード ファイルを編集できます。 また、さまざまな配置ツールを使用してバックエンド プロジェクトをダウンロードし、テーブルと API を追加または変更してからプロジェクトを再発行することもできます。 詳細については、 Azure App Service デプロイ ガイドを参照してください。

次の手順では、Git リポジトリを使用してクイック スタート プロジェクト コードをダウンロードします。

  1. まだインストールしていない場合は、Git をインストールします。 Git のインストールに必要な手順は、オペレーティング システムによって異なります。 オペレーティング システム固有のディストリビューションとインストール ガイダンスについては、「Git の インストール」を参照してください。

  2. バックエンド サイトの Git リポジトリを有効にするためにリポジトリを 準備 するを参照してください。 デプロイのユーザー名とパスワードを書き留めます。

  3. Mobile Apps バックエンドのペインで、Git クローンの URL 設定を記録しておきます。

  4. Git クローン URL を使用して、 git clone コマンドを実行します。 次の例のように、必要に応じてパスワードを入力します。

     $ git clone https://username@todolist.scm.azurewebsites.net:443/todolist.git
    
  5. ローカル ディレクトリ (前の例の/todolist ) を参照し、プロジェクト ファイルがダウンロードされていることを確認します。 /tables ディレクトリで todoitem.json ファイルを見つけます。 このファイルは、テーブルに対するアクセス許可を定義します。 同じディレクトリ内の todoitem.js ファイルも検索します。 テーブルの CRUD 操作スクリプトを定義します。

  6. プロジェクト ファイルに変更を加えた後、次のコマンドを実行して、サイトに変更を追加、コミット、アップロードします。

     $ git commit -m "updated the table script"
     $ git push origin master
    

    プロジェクトに新しいファイルを追加するときは、最初に git add . コマンドを実行する必要があります。

新しいコミット セットがサイトにプッシュされるたびに、サイトが更新されます。

Node.js バックエンドを Azure に発行する

Microsoft Azure には、Mobile Apps Node.js バックエンドを Azure サービスに発行するための多くのメカニズムが用意されています。 これらのメカニズムには、Visual Studio に統合された配置ツール、コマンドライン ツール、ソース管理に基づく継続的配置オプションが含まれます。 詳細については、 Azure App Service デプロイ ガイドを参照してください。

Azure App Service には、バックエンドを発行する前に確認する必要がある Node.js アプリケーションに関する具体的なアドバイスがあります。

アプリケーションのホーム ページを有効にする

多くのアプリケーションは、Web アプリとモバイル アプリの組み合わせです。 ExpressJS フレームワークを使用して、2 つのファセットを組み合わせることができます。 ただし、モバイル インターフェイスのみを実装したい場合もあります。 ホーム ページを提供して、アプリ サービスが稼働していることを確認すると便利です。 独自のホーム ページを提供することも、一時的なホーム ページを有効にすることもできます。 一時的なホーム ページを有効にするには、次のコードを使用して Mobile Apps をインスタンス化します。

var mobile = azureMobileApps({ homePage: true });

ローカルでの開発時にのみこのオプションを使用する場合は、この設定を azureMobile.js ファイルに追加できます。

テーブル操作

azure-mobile-apps Node.js Server SDK には、Azure SQL Database に格納されているデータ テーブルを Web API として公開するメカニズムが用意されています。 次の 5 つの操作が提供されます。

オペレーション 説明
GET /tables/tablename テーブル内のすべてのレコードを取得します。
GET /tables/tablename/:id テーブル内の特定のレコードを取得します。
POST /tables/tablename テーブルにレコードを作成します。
PATCH /tables/tablename/:id テーブル内のレコードを更新します。
DELETE /tables/tablename/:id テーブル内のレコードを削除します。

この Web API は OData をサポートし、 オフライン データ同期をサポートするようにテーブル スキーマを拡張します。

動的スキーマを使用してテーブルを定義する

テーブルを使用する前に、テーブルを定義する必要があります。 静的スキーマ (スキーマ内の列を定義する場所) または動的 (SDK が受信要求に基づいてスキーマを制御する) を使用してテーブルを定義できます。 さらに、定義に JavaScript コードを追加することで、Web API の特定の側面を制御できます。

ベスト プラクティスとして、 tables ディレクトリの JavaScript ファイルで各テーブルを定義し、 tables.import() メソッドを使用してテーブルをインポートする必要があります。 basic-app サンプルを拡張して、app.js ファイルを調整します。

var express = require('express'),
    azureMobileApps = require('azure-mobile-apps');

var app = express(),
    mobile = azureMobileApps();

// Define the database schema that is exposed.
mobile.tables.import('./tables');

// Provide initialization of any tables that are statically defined.
mobile.tables.initialize().then(function () {
    // Add the Mobile API so it is accessible as a Web API.
    app.use(mobile);

    // Start listening on HTTP.
    app.listen(process.env.PORT || 3000);
});

./tables/TodoItem.jsでテーブルを定義します。

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Additional configuration for the table goes here.

module.exports = table;

テーブルでは、既定で動的スキーマが使用されます。 動的スキーマをグローバルに無効にするには、Azure portal で MS_DynamicSchema アプリの設定を false に設定します。

完全な例については、 GitHub の todo サンプルを参照してください

静的スキーマを使用してテーブルを定義する

Web API を使用して公開する列を明示的に定義できます。 azure-mobile-apps Node.js SDK は、オフライン データ同期に必要な列を指定したリストに自動的に追加します。 たとえば、クイック スタート クライアント アプリケーションには、 text (文字列) と complete (ブール型) の 2 つの列を含むテーブルが必要です。
テーブルは、次のようにテーブル定義 JavaScript ファイル ( tables ディレクトリにあります) で定義できます。

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define the columns within the table.
table.columns = {
    "text": "string",
    "complete": "boolean"
};

// Turn off the dynamic schema.
table.dynamicSchema = false;

module.exports = table;

テーブルを静的に定義する場合は、 tables.initialize() メソッドを呼び出して、起動時にデータベース スキーマを作成する必要もあります。 tables.initialize() メソッドは promise を返し、データベースが初期化される前に Web サービスが要求を処理しないようにします。

ローカル コンピューター上の開発データ ストアとして SQL Server Express を使用する

Mobile Apps Node.js SDK には、すぐに使用できるデータを提供するための 3 つのオプションが用意されています。

  • メモリ ドライバーを使用して、非永続的なストアの例を提供します。
  • mssql ドライバーを使用して、開発用の SQL Server Express データ ストアを提供します。
  • mssql ドライバーを使用して、運用環境用の Azure SQL Database データ ストアを提供します。

Mobile Apps Node.js SDK では、 mssql Node.js パッケージ を使用して、SQL Server Express と SQL Database の両方への接続を確立して使用します。 このパッケージでは、SQL Server Express インスタンスで TCP 接続を有効にする必要があります。

ヒント

メモリ ドライバーには、テスト用の完全な機能セットが用意されていません。 バックエンドをローカルでテストする場合は、SQL Server Express データ ストアと mssql ドライバーを使用することをお勧めします。

  1. Microsoft SQL Server 2014 Express をダウンロードしてインストールします。 SQL Server 2014 Express with Tools エディションをインストールしていることを確認します。 64 ビットのサポートを明示的に必要とする場合を除き、32 ビット バージョンでは実行時に消費されるメモリが少なくなります。

  2. SQL Server 2014 Configuration Manager を実行します。

    a ツリー メニューの [SQL Server ネットワーク構成] ノードを展開します。

    b。 SQLEXPRESS のプロトコルを選択します。

    c. [TCP/IP] を右クリックし、[有効] を選択します。 ポップアップ ダイアログ ボックスで [ OK] を 選択します。

    d. TCP/IP を右クリックし、[プロパティ] を選択します。

    e. [ IP アドレス] タブを 選択します。

    f. IPAll ノードを見つけます。 [TCP ポート] フィールドに「1433」と入力します。

    TCP/IP 用に SQL Server Express を構成する

    g. [OK] を選択. ポップアップ ダイアログ ボックスで [ OK] を 選択します。

    h. ツリー メニューで [SQL Server サービス ] を選択します。

    i. SQL Server (SQLEXPRESS) を右クリックし、[再起動] を選択します。

    j. SQL Server 2014 構成マネージャーを閉じます。

  3. SQL Server 2014 Management Studio を実行し、ローカルの SQL Server Express インスタンスに接続します。

    1. オブジェクト エクスプローラーでインスタンスを右クリックし、[プロパティ] を選択 します

    2. [セキュリティ] ページを選択します。

    3. SQL Server と Windows 認証モードが選択されていることを確認します。

    4. [OK] を選択.

      SQL Server Express 認証を構成する

    5. オブジェクト エクスプローラーで [ セキュリティ>Logins ] を展開します。

    6. [ ログイン ] を右クリックし、[ 新しいログイン] を選択します。

    7. ログイン名を入力します。 [SQL Server 認証] をクリックします。 パスワードを入力し、[パスワードの確認] に同じパスワードを入力 します。 パスワードは、Windows の複雑さの要件を満たしている必要があります。

    8. [OK] を選択.

      SQL Server Express に新しいユーザーを追加する

    9. 新しいログインを右クリックし、[ プロパティ] を選択します。

    10. [ サーバー ロール] ページを選択します。

    11. dbcreator サーバー ロールのチェック ボックスをオンにします。

    12. [OK] を選択.

    13. SQL Server 2015 Management Studio を閉じます。

選択したユーザー名とパスワードを必ず記録してください。 データベースの要件によっては、追加のサーバー ロールまたはアクセス許可を割り当てる必要がある場合があります。

Node.js アプリケーションは、このデータベースの接続文字列の SQLCONNSTR_MS_TableConnectionString 環境変数を読み取ります。 この変数は、環境内で設定できます。 たとえば、PowerShell を使用してこの環境変数を設定できます。

$env:SQLCONNSTR_MS_TableConnectionString = "Server=127.0.0.1; Database=mytestdatabase; User Id=azuremobile; Password=T3stPa55word;"

TCP/IP 接続を介してデータベースにアクセスします。 接続のユーザー名とパスワードを指定します。

ローカル開発用にプロジェクトを構成する

Mobile Apps は、ローカル ファイル システムから azureMobile.js という JavaScript ファイルを読み取ります。 運用環境で Mobile Apps SDK を構成するには、このファイルを使用しないでください。 代わりに、Azure portalアプリ設定を使用します。

azureMobile.js ファイルは、構成オブジェクトをエクスポートする必要があります。 最も一般的な設定は次のとおりです。

  • データベース設定
  • 診断ログの設定
  • 別のCORS設定

この azureMobile.jsファイルの 例では、上記のデータベース設定が実装されています。

module.exports = {
    cors: {
        origins: [ 'localhost' ]
    },
    data: {
        provider: 'mssql',
        server: '127.0.0.1',
        database: 'mytestdatabase',
        user: 'azuremobile',
        password: 'T3stPa55word'
    },
    logging: {
        level: 'verbose'
    }
};

パスワードがクラウドに格納されないように、.gitignore ファイル (または他のソース コード管理の無視ファイル) にazureMobile.jsを追加することをお勧めします。 Azure portal 内のアプリ設定で、常に運用環境の設定を構成します。

モバイル アプリのアプリ設定を構成する

azureMobile.js ファイルのほとんどの設定には、 Azure portal で同等のアプリ設定があります。 アプリ設定でアプリを構成するには、次の一覧 使用します。

アプリ設定 azureMobile.js 設定 説明 有効な値
MS_MobileAppName 名前 アプリの名前 ひも
MS_モバイルログレベル logging.level ログに記録するメッセージの最小ログ レベル エラー, 警告, インフォ, 冗長, デバッグ, ふざけ
MS_DebugMode デバッグ デバッグ モードを有効または無効にします 真、偽
MS_TableSchema データスキーマ SQL テーブルの既定のスキーマ名 string (既定値: dbo)
MS_DynamicSchema data.dynamicSchema デバッグ モードを有効または無効にします 真、偽
MS_DisableVersionHeader version (undefined に設定) X-ZUMO-Server-Version ヘッダーを無効にします。 真、偽
MS_バージョンチェックをスキップ skipversioncheck クライアント API のバージョン チェックを無効にします。 真、偽

アプリ設定を設定するには:

  1. Azure portal にサインインします。
  2. [すべてのリソース] または [App Services] を選択し、モバイル アプリの名前を選択します。
  3. 既定では 、[設定] ウィンドウが開きます。 そうでない場合は、設定 を選択します。
  4. [ 全般 ] メニューの [ アプリケーション設定] を選択します。
  5. [ アプリの設定 ] セクションまでスクロールします。
  6. アプリ設定が既に存在する場合は、アプリ設定の値を選択して値を編集します。 アプリ設定が存在しない場合は、[ キー ] ボックスにアプリ設定を入力し、[ ] ボックスに値を入力します。
  7. 保存 を選択します。

ほとんどのアプリ設定を変更するには、サービスを再起動する必要があります。

実稼働データ ストアとして SQL Database を使用する

データ ストアとして Azure SQL Database を使用することは、すべての Azure App Service アプリケーションの種類で同じです。 まだ行っていない場合は、次の手順に従って Mobile Apps バックエンドを作成します。

  1. Azure portal にサインインします。

  2. ウィンドウの左上にある [ +新規 ] ボタン >Web + Mobile>Mobile アプリを選択し、Mobile Apps バックエンドの名前を指定します。

  3. [ リソース グループ ] ボックスに、アプリと同じ名前を入力します。

  4. 既定の App Service プランが選択されています。 App Service プランを変更する場合:

    ある。 App Service プラン>を選択し、+ 新規作成します。

    b。 新しい App Service プランの名前を指定し、適切な場所を選択します。

    c. サービスに適した価格レベルを選択します。 [ すべて表示] を選択すると、 FreeShared などのその他の価格オプションが表示されます。

    d. [選択] ボタンをクリックします。

    e. App Service プラン ウィンドウに戻り、[OK] を選択します

  5. を選択してを作成します。

Mobile Apps バックエンドのプロビジョニングには数分かかる場合があります。 Mobile Apps バックエンドがプロビジョニングされると、ポータルで Mobile Apps バックエンドの [設定] ウィンドウが開きます。

既存の SQL データベースを Mobile Apps バックエンドに接続するか、新しい SQL データベースを作成するかを選択できます。 このセクションでは、SQL データベースを作成します。

Mobile Apps バックエンドと同じ場所にデータベースが既にある場合は、代わりに [ 既存のデータベースを使用 する] を選択してから、そのデータベースを選択できます。 待機時間が長いため、別の場所でデータベースを使用することはお勧めしません。

  1. 新しい Mobile Apps バックエンドで、設定>Mobile App>Data>+ Add を選択します。

  2. [ データ接続を追加 ] ペインで、[ SQL Database - 必要な設定を構成>新しいデータベースを作成します。 [名前] ボックスに新しいデータベースの 名前 を入力します。

  3. [サーバー] を選択します。 [ 新しいサーバー ] ウィンドウで、[サーバー名] ボックスに一意 のサーバー名 を入力し、適切なサーバー管理者ログインとパスワードを指定します。 [ Azure サービスにサーバーへのアクセスを許可する] が選択されていることを確認します。 [OK] を選択.

    Azure SQL データベースを作成する

  4. [ 新しいデータベース ] ウィンドウで、[ OK] を選択します

  5. [ データ接続の追加 ] ウィンドウに戻り、[ 接続文字列] を選択し、データベースの作成時に指定したログインとパスワードを入力します。 既存のデータベースを使用する場合は、そのデータベースのログイン資格情報を指定します。 [OK] を選択.

  6. [ データ接続の追加 ] ウィンドウに戻り、[ OK] を 選択してデータベースを作成します。

データベースの作成には数分かかる場合があります。 [通知] 領域を使用して、デプロイの進行状況を監視します。 データベースが正常にデプロイされるまで、進行しないでください。 データベースがデプロイされると、Mobile Apps バックエンド アプリの設定で SQL Database インスタンスの接続文字列が作成されます。 このアプリの設定は、設定>アプリケーション設定>接続文字列で確認できます。

テーブルへのアクセスに認証を要求する

tables エンドポイントで App Service 認証を使用する場合は、まず Azure portal で App Service 認証を構成する必要があります。 詳細については、使用する ID プロバイダーの構成ガイドを参照してください。

各テーブルには、テーブルへのアクセスを制御するために使用できるアクセス プロパティがあります。 次の例は、認証が必要な静的に定義されたテーブルを示しています。

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define the columns within the table.
table.columns = {
    "text": "string",
    "complete": "boolean"
};

// Turn off the dynamic schema.
table.dynamicSchema = false;

// Require authentication to access the table.
table.access = 'authenticated';

module.exports = table;

access プロパティは、次の 3 つの値のいずれかを受け取ることができます。

  • anonymous は、クライアント アプリケーションが認証なしでデータの読み取りを許可されていることを示します。
  • authenticated は、 クライアント アプリケーションが要求と共に有効な認証トークンを送信する必要があることを示します。
  • disabled は、このテーブルが現在無効になっていることを示します。

アクセス プロパティが未定義の場合は、認証されていないアクセスが許可されます。

テーブルで認証クレームを使用する

認証の設定時に要求されるさまざまな要求を設定できます。 これらの要求は、通常、 context.user オブジェクトを介して使用することはできません。 ただし、 context.user.getIdentity() メソッドを使用して取得できます。 getIdentity() メソッドは、オブジェクトに解決される promise を返します。 オブジェクトは、認証方法 (facebookgoogletwittermicrosoftaccount、または aad) によってキーが設定されます。

たとえば、Microsoft アカウント認証を設定し、電子メール アドレス要求を要求する場合は、次のテーブル コントローラーを使用してレコードに電子メール アドレスを追加できます。

var azureMobileApps = require('azure-mobile-apps');

// Create a new table definition.
var table = azureMobileApps.table();

table.columns = {
    "emailAddress": "string",
    "text": "string",
    "complete": "boolean"
};
table.dynamicSchema = false;
table.access = 'authenticated';

/**
* Limit the context query to those records with the authenticated user email address
* @param {Context} context the operation context
* @returns {Promise} context execution Promise
*/
function queryContextForEmail(context) {
    return context.user.getIdentity().then((data) => {
        context.query.where({ emailAddress: data.microsoftaccount.claims.emailaddress });
        return context.execute();
    });
}

/**
* Adds the email address from the claims to the context item - used for
* insert operations
* @param {Context} context the operation context
* @returns {Promise} context execution Promise
*/
function addEmailToContext(context) {
    return context.user.getIdentity().then((data) => {
        context.item.emailAddress = data.microsoftaccount.claims.emailaddress;
        return context.execute();
    });
}

// Configure specific code when the client does a request.
// READ: only return records that belong to the authenticated user.
table.read(queryContextForEmail);

// CREATE: add or overwrite the userId based on the authenticated user.
table.insert(addEmailToContext);

// UPDATE: only allow updating of records that belong to the authenticated user.
table.update(queryContextForEmail);

// DELETE: only allow deletion of records that belong to the authenticated user.
table.delete(queryContextForEmail);

module.exports = table;

どのような要求があるかを確認するには、Webブラウザーを使用して、サイトの/.auth/meエンドポイントを表示します。

特定のテーブル操作へのアクセスを無効にする

テーブルに表示されるだけでなく、access プロパティを使用して個々の操作を制御することもできます。 次の 4 つの操作があります。

  • read は、テーブルに対する RESTful GET 操作です。
  • insert は、テーブルに対する RESTful POST 操作です。
  • update は、テーブルに対する RESTful PATCH 操作です。
  • delete は、テーブルに対する RESTful DELETE 操作です。

たとえば、読み取り専用の認証されていないテーブルを指定できます。

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Read-only table. Only allow READ operations.
table.read.access = 'anonymous';
table.insert.access = 'disabled';
table.update.access = 'disabled';
table.delete.access = 'disabled';

module.exports = table;

テーブル操作で使用されるクエリを調整する

テーブル操作の一般的な要件は、データの制限付きビューを提供することです。 たとえば、独自のレコードのみを読み取ったり更新したりできるように、認証されたユーザー ID でタグ付けされたテーブルを指定できます。 次の表の定義は、この機能を提供します。

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define a static schema for the table.
table.columns = {
    "userId": "string",
    "text": "string",
    "complete": "boolean"
};
table.dynamicSchema = false;

// Require authentication for this table.
table.access = 'authenticated';

// Ensure that only records for the authenticated user are retrieved.
table.read(function (context) {
    context.query.where({ userId: context.user.id });
    return context.execute();
});

// When adding records, add or overwrite the userId with the authenticated user.
table.insert(function (context) {
    context.item.userId = context.user.id;
    return context.execute();
});

module.exports = table;

通常クエリを実行する操作には、 where 句を使用して調整できるクエリ プロパティがあります。 query プロパティは、OData クエリをデータ バックエンドで処理できるものに変換するために使用される QueryJS オブジェクトです。 単純な等値の場合 (前の例のように) は、マップを使用できます。 特定の SQL 句を追加することもできます。

context.query.where('myfield eq ?', 'value');

テーブルにソフトデリートを設定する

ソフト削除では、実際にはレコードが削除されません。 代わりに、削除された列を true に設定して、データベース内で削除済みとしてマークします。 Mobile Apps SDK は、Mobile Client SDK が IncludeDeleted()を使用する場合を除き、結果からソフト削除されたレコードを自動的に削除します。 論理的な削除用にテーブルを構成するには、テーブル定義ファイルで softDelete プロパティを設定します。

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define the columns within the table.
table.columns = {
    "text": "string",
    "complete": "boolean"
};

// Turn off the dynamic schema.
table.dynamicSchema = false;

// Turn on soft delete.
table.softDelete = true;

// Require authentication to access the table.
table.access = 'authenticated';

module.exports = table;

レコードを削除するためのメカニズム (クライアント アプリケーション、Web ジョブ、Azure 関数、またはカスタム API) を確立する必要があります。

データを使用してデータベースをシード処理する

新しいアプリケーションを作成する場合は、テーブルにデータをシードすることができます。 これは、テーブル定義 JavaScript ファイル内で次のように行うことができます。

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define the columns within the table.
table.columns = {
    "text": "string",
    "complete": "boolean"
};
table.seed = [
    { text: 'Example 1', complete: false },
    { text: 'Example 2', complete: true }
];

// Turn off the dynamic schema.
table.dynamicSchema = false;

// Require authentication to access the table.
table.access = 'authenticated';

module.exports = table;

データのシード処理は、Mobile Apps SDK を使用してテーブルを作成した場合にのみ行われます。 テーブルがデータベースに既に存在する場合、テーブルにデータは挿入されません。 動的スキーマが有効になっている場合、スキーマはシード処理されたデータから推論されます。

tables.initialize() メソッドを明示的に呼び出して、サービスの実行を開始するときにテーブルを作成することをお勧めします。

Swagger のサポートを有効にする

Mobile Apps には 、Swagger サポートが組み込まれています。 Swagger のサポートを有効にするには、最初に依存関係として swagger-ui をインストールします。

npm install --save swagger-ui

その後、Mobile Apps コンストラクターで Swagger のサポートを有効にすることができます。

var mobile = azureMobileApps({ swagger: true });

開発エディションでのみ Swagger サポートを有効にしたい場合があります。 これを行うには、 NODE_ENV アプリの設定を使用します。

var mobile = azureMobileApps({ swagger: process.env.NODE_ENV !== 'production' });

swagger エンドポイントは、http:// oursite.azurewebsites.net/swagger にあります。 /swagger/ui エンドポイントを介して Swagger UI にアクセスできます。 アプリケーション全体で認証を要求することを選択すると、Swagger によってエラーが生成されます。 最良の結果を得るには、Azure App Service の認証/承認設定で認証されていない要求を許可し、 table.access プロパティを使用して認証を制御することを選択します。

Swagger のローカル開発のみをサポートする場合は、Swagger オプションを azureMobile.js ファイルに追加することもできます。

プッシュ通知

Mobile Apps は Azure Notification Hubs と統合されるため、すべての主要プラットフォームで何百万ものデバイスにターゲットプッシュ通知を送信できます。 Notification Hubs を使用すると、iOS、Android、および Windows デバイスにプッシュ通知を送信できます。 Notification Hubs でできることの詳細については、 Notification Hubs の概要を参照してください。

プッシュ通知を送信する

次のコードは、 push オブジェクトを使用して、登録済みの iOS デバイスにブロードキャスト プッシュ通知を送信する方法を示しています。

// Create an APNS payload.
var payload = '{"aps": {"alert": "This is an APNS payload."}}';

// Only do the push if configured.
if (context.push) {
    // Send a push notification by using APNS.
    context.push.apns.send(null, payload, function (error) {
        if (error) {
            // Do something or log the error.
        }
    });
}

クライアントからテンプレート プッシュ登録を作成することで、代わりに、サポートされているすべてのプラットフォーム上のデバイスにテンプレート プッシュ メッセージを送信できます。 次のコードは、テンプレート通知を送信する方法を示しています。

// Define the template payload.
var payload = '{"messageParam": "This is a template payload."}';

// Only do the push if configured.
if (context.push) {
    // Send a template notification.
    context.push.send(null, payload, function (error) {
        if (error) {
            // Do something or log the error.
        }
    });
}

タグを使用して認証されたユーザーにプッシュ通知を送信する

認証されたユーザーがプッシュ通知に登録すると、ユーザー ID タグが登録に自動的に追加されます。 このタグを使用すると、特定のユーザーによって登録されたすべてのデバイスにプッシュ通知を送信できます。 次のコードは、要求を行っているユーザーの SID を取得し、そのユーザーのすべてのデバイス登録にテンプレート プッシュ通知を送信します。

// Only do the push if configured.
if (context.push) {
    // Send a notification to the current user.
    context.push.send(context.user.id, payload, function (error) {
        if (error) {
            // Do something or log the error.
        }
    });
}

認証されたクライアントからのプッシュ通知に登録するときは、登録を試みる前に認証が完了していることを確認してください。

カスタム API

カスタム API を定義する

Mobile Apps では、 /tables エンドポイント経由のデータ アクセス API に加えて、カスタム API カバレッジを提供できます。 カスタム API は、テーブル定義と同様の方法で定義され、認証を含むすべての同じ機能にアクセスできます。

カスタム API で App Service 認証を使用する場合は、まず Azure portal で App Service 認証を構成する必要があります。 詳細については、使用する ID プロバイダーの構成ガイドを参照してください。

カスタム API は、Tables API とほぼ同じ方法で定義されます。

  1. api ディレクトリを作成します。
  2. api ディレクトリに API 定義 JavaScript ファイルを作成します。
  3. import メソッドを使用して、 api ディレクトリをインポートします。

前に使用した基本アプリのサンプルに基づくプロトタイプ API 定義を次に示します。

var express = require('express'),
    azureMobileApps = require('azure-mobile-apps');

var app = express(),
    mobile = azureMobileApps();

// Import the custom API.
mobile.api.import('./api');

// Add the Mobile API so it is accessible as a Web API.
app.use(mobile);

// Start listening on HTTP
app.listen(process.env.PORT || 3000);

Date.now() メソッドを使用してサーバーの日付を返す API の例を見てみましょう。 api/date.js ファイルを次に示します。

var api = {
    get: function (req, res, next) {
        var date = { currentTime: Date.now() };
        res.status(200).type('application/json').send(date);
    });
};

module.exports = api;

各パラメーターは、GET、POST、PATCH、または DELETE という標準的な RESTful 動詞の 1 つです。 このメソッドは、必要な出力を送信する標準 の ExpressJS ミドルウェア 関数です。

カスタム API へのアクセスに認証を要求する

Mobile Apps SDK は、 tables エンドポイントとカスタム API の両方に対して同じ方法で認証を実装します。 前のセクションで開発した API に認証を追加するには、 access プロパティを追加します。

var api = {
    get: function (req, res, next) {
        var date = { currentTime: Date.now() };
        res.status(200).type('application/json').send(date);
    });
};
// All methods must be authenticated.
api.access = 'authenticated';

module.exports = api;

特定の操作で認証を指定することもできます。

var api = {
    get: function (req, res, next) {
        var date = { currentTime: Date.now() };
        res.status(200).type('application/json').send(date);
    }
};
// The GET methods must be authenticated.
api.get.access = 'authenticated';

module.exports = api;

認証を必要とするカスタム API には、 tables エンドポイントに使用されるのと同じトークンを使用する必要があります。

大きなファイルのアップロードを処理する

Mobile Apps SDK では、 本文パーサー ミドルウェア を使用して、申請の本文コンテンツを受け入れてデコードします。 より大きなファイルのアップロードを受け入れるように、body-parser を事前に構成できます。

var express = require('express'),
    bodyParser = require('body-parser'),
    azureMobileApps = require('azure-mobile-apps');

var app = express(),
    mobile = azureMobileApps();

// Set up large body content handling.
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));

// Import the custom API.
mobile.api.import('./api');

// Add the Mobile API so it is accessible as a Web API.
app.use(mobile);

// Start listening on HTTP.
app.listen(process.env.PORT || 3000);

ファイルは転送前に base-64 でエンコードされます。 このエンコードにより、実際のアップロードのサイズ (および考慮する必要があるサイズ) が増加します。

カスタム SQL ステートメントを実行する

Mobile Apps SDK では、要求オブジェクトを介してコンテキスト全体にアクセスできます。 パラメーター化された SQL ステートメントは、定義されたデータ プロバイダーに対して簡単に実行できます。

var api = {
    get: function (request, response, next) {
        // Check for parameters. If not there, pass on to a later API call.
        if (typeof request.params.completed === 'undefined')
            return next();

        // Define the query. Anything that the mssql
        // driver can handle is allowed.
        var query = {
            sql: 'UPDATE TodoItem SET complete=@completed',
            parameters: [{
                completed: request.params.completed
            }]
        };

        // Execute the query. The context for Mobile Apps is available through
        // request.azureMobile. The data object contains the configured data provider.
        request.azureMobile.data.execute(query)
        .then(function (results) {
            response.json(results);
        });
    }
};

api.get.access = 'authenticated';
module.exports = api;

デバッグ

Mobile Apps のデバッグ、診断、トラブルシューティング

Azure App Service には、Node.js アプリケーションのデバッグとトラブルシューティングの手法がいくつか用意されています。 Node.js Mobile Apps バックエンドのトラブルシューティングを開始するには、次の記事を参照してください。

Node.js アプリケーションは、さまざまな診断ログ ツールにアクセスできます。 内部的には、Mobile Apps Node.js SDK は診断ログに Winston を使用します。 デバッグ モードを有効にするか、Azure portalMS_DebugMode アプリの設定を true に設定すると、ログ記録が自動的に有効になります。 生成されたログは、 Azure portal の診断ログに表示されます。