大人気となっている id:garicchi の Azure と 機械学習 と IoT を組み合わせた記事を楽しくよませていただきました。
Azure Machine LearningとIoTを駆使して室温予測システムを構築してみた - がりらぼ
その中で、
Azure Mobile ServicesのJavascriptバックエンドでデータ挿入時に時間を含めたい - がりらぼ
**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?
Retrieve System Properties in Azure Mobile Services (JavaScript Backend) | brandon martinez
Retrieve System Properties in Azure Mobile Services (JavaScript Backend) | brandon martinez
CreatedAt property null when working with Offline tables in Azure Mobile Services