Azure Mobile Apps Node.js Server SDK v3.0.0 のリリースを発表

執筆者: Adrian Hall (Sr. Program Manager, Azure App Service Mobile Apps)

このポストは、9 月 20 日に投稿された Announcing the release of Azure Mobile Apps Node SDK v3.0.0 の翻訳です。

 

Azure Mobile Apps Node.js Server SDK の次期バージョンが発表されました。今回のリリースでは多くの新機能の追加、機能強化、不具合の修正が行われています。

データ変換、フィルター、フック

Server SDK の主な機能の 1 つに、セキュリティ フィルターとレコードの変換をサーバー レベルで提供し、開発者が JavaScript コードを作成してサーバーの要求-応答パイプラインを改良できるようにする、というものがあります。今回の v3.0 リリースでは拡張ポイントの改良をさらに進め、受信したクエリやアイテムを処理したり、各データ操作の後に機能をトリガーしたりできるようにしました。独自のフィルター、変換、フックの作成と配信も、もちろん可能です。また、コードの量を少なくするために一般的なフィルターをパッケージ化しました。

ユーザー別のテーブル

おそらく最も頻繁に使用されるフィルター要求は、「データをユーザー別に提供する」ものです。ユーザー別のテーブルは認証機能と組み合わせて使用することで、テーブル内のデータを各ユーザーに提供する際に制限を適用できます。このフィルターを使用する場合、テーブル定義に perUser = true というコードを追加します。以下はその例です。

 var table = require("azure-mobile-apps").table(); 
table.access = "authenticated";
table.perUser = true; 
module.exports = table;

Web フック

Web フックは、データ操作が完了した後に外部の HTTP エンドポイント (Azure Functions など) を呼び出す際に使用されます。

 var table = require("azure-mobile-apps").table();
table.webhook = { url: "https://function.azurewebsites.net/apo/HttpTriggerNodeJS1" };
module.exports = table;

HTTP エンドポイントに送信される構造など、この機能の詳細については API リファレンス (英語) を参照してください。

レコードの有効期限

もう 1 つのよく使用されるフィルター要求は、「一定期間よりも古いレコードへのアクセスを禁止する」ものです。以下は、1 日前よりも古いレコードへのアクセスを拒否する場合の例です。

 var table = require("azure-mobile-apps").table();
tables.recordsExpire = { days: 1 };
module.exports = table;

期間の指定の詳細については、API リファレンス (英語) を参照してください。

データ クエリの改良

Azure Mobile Apps サーバーは、テーブルを適切に生成するために他のテーブルを参照する場合があります。今回のリリースではクエリ API (英語) が強化され、特定の一般的なシナリオでの利便性が向上しました。

論理的に削除されたレコードを含める

論理的な削除を有効にしている場合、レコードは実際に SQL テーブルから削除されるのではなく、削除済みとしてマークされます。この情報は他のモバイル デバイスに伝達され、オフライン キャッシュの更新に利用されます。削除されたアイテムを含める場合は、以下のようにクエリで .includeDeleted() を指定します。

 table.insert((context) => {
    return context.tables('otherTable').includeDeleted().read()
        .then((results) => {
            context.item.count = results.length;
            return context.execute();
        });
});

ID 別にレコードを取得する

今回のリリースではシンプルな find 関数が追加され、以下のように ID 別のレコード取得が大幅に簡素化されました。

 table.insert((context) => {
    return context.tables('otherTable').find(context.item.parentId)
        .then((parent) => {
            context.item.parentName = parent.name;
            return context.execute();
        });
});

オブジェクト クエリ

これまで、テーブルのクエリ操作ではオブジェクトに基づくクエリを使用できましたが、更新操作や削除操作では使用できませんでした。今回のリリースでこれらの操作が可能になりました。以下は、依存関係にあるレコードを削除する場合の例です。

 table.delete((context) => {
    return context.tables('childTable')
        .delete({ parentId: context.item.id })
        .then(context.execute);
});

テーブル関数でのコールバックの処理

これまでの SDK ではテーブル操作関数でコールバックがサポートされていませんでした。Promise を生成するコードのリファクタリングではこのようなメソッドが必要だったため、今回の v3.0.0 でコールバックを直接サポートすることにしました。コールバックが完了すると context.next(err) が呼び出され、すべてのエラーが渡されます。以下がその例です。

     var mongo = require('mongodb').MongoClient;

    table.insert(function (context) {
        context.execute().then(function () {
            mongo.connect('mongodb://localhost:27017/test', function(err, db) {
                db.collection('items').insertOne(context.item, function (err) {
                    // 操作が完了したことを示し、エラーが発生した場合はそのエラーをすべて渡す
                    context.next(err);
                });
            });
        });
    });

大きな変更点

これまで、SQL Server に対して skip() 句と take() 句の両方を含むクエリを実行すると、そのクエリで生成された追加の列 (ROW_NUMBER) が返されていました。今回のバージョンでは、この列が返されないようになりました。この変更は SQL Server 2012 またはそれ以降で使用可能な T-SQL 機能を使用して実装されたため、SQL Server 2012 よりも古いバージョンがサポートされなくなったことがその理由です。

SDK のインストール

モバイル アプリを新規作成する場合、または既存のアプリをアップグレードする場合、Azure Mobile Apps Server Node.js Server SDK は npm からインストールできます。

 npm install --save azure-mobile-apps@3.0

API に関する完全なドキュメントは、GitHub リポジトリ (英語) で公開されています。また、モバイル バックエンドの構築方法については、使用方法の説明ドキュメントを参照してください。