大人気となっている 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 べんり
参考リンク
Retrieve System Properties in Azure Mobile Services (JavaScript Backend) | brandon martinez