世界のやまさ

SEKAI NO YAMASA

Microsoft Azure Mobile Services(モバイルサービス) で '__createdAt' を取得する方法

大人気となっている id:garicchi の Azure と 機械学習 と IoT を組み合わせた記事を楽しくよませていただきました。

その中で、

MobileServicesはデータ挿入時に自動で__createdAtというカラムが追加されるはずなのですが何故かスクリプトから参照できなかったので自前でタイムスタンプを入れることにしました。

とあったのですが、多分出来るはずと思って調べてみました。

問題

Microsoft Azure Mobile Services(モバイルサービス) のサーバースクリプト(Javascrip バックエンド) で 'createdAt', 'updateAt', 'version', 'deleted' のシステムプロパティが取得できない。

例えばこんなカスタムAPIを作成して、全件取得したいのに '__createdAt' が表示されない。

サンプルコード
exports.get = function(request, response) {
    var myTable = request.service.tables.getTable('TodoItem');
    myTable.read({
        success: function(results) {
            response.send(statusCodes.OK, results);
        },
        error: function(err) {
         response.send(statusCodes.INTERNAL_SERVER_ERROR, err);
        }
    });
};
取得結果

ブラウザかなんかで https://hogehoge.azure-mobile.net/api/fugafuga を GET する。

[
  {"id":"32ADB4B1-D515-4666-AAA7-57466FCEC261","text":"なんかのテキスト","complete":false}, ... 省略
]

解決方法

success の前に systemProperties: ['__createdAt', '__updatedAt'], を入れる。全部のシステムプロパティが欲しければ systemProperties: ['*'],

サンプルコード
exports.get = function(request, response) {
    var myTable = request.service.tables.getTable('TodoItem');
    myTable.read({
        systemProperties: ['__createdAt', '__updatedAt'],
        success: function(results) {
            response.send(statusCodes.OK, results);
        },
        error: function(err) {
         response.send(statusCodes.INTERNAL_SERVER_ERROR, err);
        }
    });
};
取得結果

ブラウザかなんかで https://hogehoge.azure-mobile.net/api/fugafuga を GET する。

[
  {"id":"32ADB4B1-D515-4666-AAA7-57466FCEC261","__createdAt":"2015-03-03T14:32:04.518Z","__updatedAt":"2015-03-03T14:32:04.518Z","text":"なんかのテキスト","complete":false}, ... 省略
]

補足:クライアントで使うときも注意が必要

どーも、__createdAt とかはシステムプロパティという特殊な扱いなようで、クライアント側で利用する際にも注意が必要です。

c# のサンプルコード

属性で CreatedAt のようにつける

 public class TodoItem
 {
  public string Id { get; set; }       
  [CreatedAt]
  public DateTimeOffset? CreatedAt { get; set; }
  [UpdatedAt]
  public DateTimeOffset? UpdatedAt { get; set; }
  public string Text { get; set; }
  public bool Complete { get; set; }
}
Android(Java) のサンプルコード

アノテーション__createdAt つければ良いみたいでした。SDKがちゃんと Date にしてくれる。

public class ToDoItem {

    @com.google.gson.annotations.SerializedName("text")
    private String mText;

    @com.google.gson.annotations.SerializedName("id")
    private String mId;

    @com.google.gson.annotations.SerializedName("complete")
    private boolean mComplete;

    @com.google.gson.annotations.SerializedName("__createdAt")
    private Date date;

    // ... 省略

まとめ

モバイルサービス is べんり

参考リンク

How to get system properties __CreatedAt, __Version in javascript backend of Azure Mobile services? - Stack Overflow

Retrieve System Properties in Azure Mobile Services (JavaScript Backend) | brandon martinez

c# - CreatedAt property null when working with Offline tables in Azure Mobile Services - Stack Overflow