Parse Hostingを使ってみた


先月、Facebookによって買収された事で注目されていたParseを使ってみました。

ParseはJavaScript SDKを使う事で、簡単にデータをParse内に保存する事ができます。SDKは他にもiOS/Android/Windows Phone 8/Windows/Mac OSX用もあるので、クロスプラットフォームなアプリを作る時に重宝しそうです。
料金も安く、小規模なサイト・アプリであれば無料枠で使えそうです。

今回はJavaScriptを使って、簡単なデータの保存や読み出し、更新などをやってみました。

index.html

BootStrapを使っていますが、CSSだけです。
input#fooに入力したものをParseに保存し、「Load」ボタンで取得、table#resultに表示します。
table#result td input[name="foo"]が編集されたらデータを更新しに行きます。

<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="utf-8" />
		<title>Parse sample #1</title>
		<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" />
	</head>
	<body>
		<fieldset>
			<input name="foo" id="foo" placeholder="some value" />
			<div id="save" class="btn btn-primary">new</div>

			<div id="alert" class="alert alert-error" style="display:none">
				<button type="button" class="close" data-dismiss="alert">&times;</button>
				<strong>エラー</strong> 何か入力してください!
			</div>
			<div id="success" class="alert alert-success" style="display:none">
				<button type="button" class="close" data-dismiss="alert">&times;</button>
				<strong>成功</strong> 保存しました!
			</div>
			<div id="error" class="alert alert-error" style="display:none">
				<button type="button" class="close" data-dismiss="alert">&times;</button>
				<strong>エラー</strong> 保存できませんでした!
			</div>
		</fieldset>
		<div id="load" class="btn">load!!</div>
		<table id="result" class="table table-striped">
			<tr>
				<th>id</th>
				<th>foo</th>
				<th>createdAt</th>
				<th>updatedAt</th>
			</tr>
		</table>
		<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
		<script src="http://www.parsecdn.com/js/parse-1.2.7.min.js"></script>
		<script src="js/index.js"></script>
	</body>
</html>

index.js

Parse.initialize()はParseでアプリケーションを作ると取得できます。
Parse.Object.extend("TestObject")でオブジェクトを作れば、(設定によりますが)Parseのサイトの「Data Browser」に追加されます。型を予め決める必要がないのがKVSみたいですね。createdAt/updatedAtは自動で作成されます。

var init = function() {
	Parse.initialize("******************", "*****************");
};

var show_result = function(id) {
	$(id).slideDown(function(){
		setTimeout(function(){
			$(id).slideUp();
		}, 3000);
	});
};

var save = function() {
	// Parseのオブジェクトを作成
	var TestObject = Parse.Object.extend("TestObject");
	// TestObjectオブジェクトのインスタンスを作成
	var testObject = new TestObject();

	// 入力値を取得
	var fooVal = $('#foo').val();
	if (fooVal.length === 0) {
		show_result('#alert');
		return false;
	}

	// 引数を渡して保存
	testObject.save({foo: fooVal}, {
		// 成功時
		success: function(object) {
			show_result('#success');
			console.log(object);
		},
		// 失敗時
		error: function(object, error) {
			show_result('#error');
			console.log(object, error);
		}
	});
};

var load = function() {
	// Parseのオブジェクトを作成
	var TestObject = Parse.Object.extend("TestObject");
	// TestObjectオブジェクトの問い合わせインスタンスを作成
	var query = new Parse.Query(TestObject);

	query.limit(10);				// 取得最大数
	query.ascending("createdAt");	//ソート

	// 問い合わせ
	query.find({
		// 成功時
		success:function(obj){
			// テーブルに書き込み
			for (var i = 0; i < obj.length; i++) {
				var result = obj[i];
				$('#result').append(
					$('<tr>').append(
						$('<td>').text( result.id ),
						$('<td>').html( $('<input>').attr('name', 'foo').data({'original': result}).val(result.attributes.foo ) ),
						$('<td>').text( result.createdAt.toLocaleString() ),
						$('<td>').text( result.updatedAt.toLocaleString() )
					)
				);
			}
		},
		// 失敗時
		error:function(result, error) {
			console.log(error);
		}
	});
};

var update = function(elem) {
	// 要素に保存していたオリジナルデータを取得
	var org = elem.data('original');
	if (elem.val() !== org.attributes.foo) {
		// キーfooのデータを入力値にセット
		org.set('foo', elem.val());
		console.log(org);
		//更新
		org.save({
			// 成功時
			success: function(object) {
				alert("updated");
				console.log(object);
			},
			// 失敗時
			error: function(object, error) {
				alert("error happened!!!");
				console.log(object, error);
			}
		});
	}
};

var register_event = function() {
	$('#save').on('click', function() {
		save();
	});
	$('#load').on('click', function() {
		load();
	});
	$('#result').on('change', ':input', function(){
		update($(this));
	});
};
$(document).ready(function(){
	init();
	register_event();
});

Data Browser


左ペインがクラス、右ペインがデータになっています。
また、クラスにUserがありますが、FacebookTwitterとのユーザ連携も簡単にできるようです。

ここまで簡単だと、複雑な処理がない限り、サーバを用意する必要もなくなってきますね。