【Parse】 Parse.comのCloudCodeでレコードの保存、取得、変更を行う
さて、前回ParseのCloudCodeについてブログを書きましたが 早速使ってみました。 といっても簡単なものですが保存、検索等よく使うものの簡単な説明です。
もちろんafterSaveやbeforeSave等便利なものは多くあるのですが まずは基本です。
今回はTestって安直なClassを用意しました。 そこに対してSaveして、更にSaveしたものをGetして確認 そこからSaveした内容を変更してみたいと思います。
[TOC]
レコードの保存(Save)
/** * save */ Parse.Cloud.define("saveTest", function(request, response) { var TestClass = Parse.Object.extend('Test'); var Test = new TestClass(); var userName = "Ben"; var age = 18; Test.set("name", userName); Test.set("age", age); Test.save(null, { success: function(result) { response.success("done!"); }, error: function(error) { response.error(error); } }); });
これは基本的なものですね。 userNameとageを定義してそのユーザのデータを作成します。 Test.setにColumn名指定し、そこに入れたいデータですね。 そして最後にsaveするとsetしたデータが作成されます。
実行は以下のコマンドで
curl -X POST -H "X-Parse-Application-Id: [Application ID]" -H "X-Parse-REST-API-Key: [REST API Key]" -H "Content-Type: application/json" -d "{}" https://api.parse.com/1/functions/saveTest
今回はパラメータの指定はないのでjsonは空にしていますが -dを削っちゃってもOKです。
返り値は以下の通りです。
# curl -X POST -H "X-Parse-Application-Id: [Application ID]" -H "X-Parse-REST-API-Key: [REST API Key]" -H "Content-Type: application/json" -d "{}" https://api.parse.com/1/functions/saveTest {"result":"done!"}
成功しているので response.success("done!"); となっているところが実行され、返ってきました。
でもこのコードだと毎回"Ben"ってユーザしか登録されません。 ということでパラメータを渡して登録させましょう。 パラメータを受け取るとコードでは
request.params.xxxx
という形で受け取れます。
コードは以下の通りです。
/** * save result.params */ Parse.Cloud.define("saveTestRequestParams", function(request, response) { var TestClass = Parse.Object.extend('Test'); var Test = new TestClass(); var userName = request.params.userName; var age = request.params.age; Test.set("name", userName); Test.set("age", 18); Test.save(null, { success: function(result) { response.success("done!"); }, error: function(error) { response.error(error); } }); });
実行は以下です。
curl -X POST -H "X-Parse-Application-Id: [Application ID]" -H "X-Parse-REST-API-Key: [REST API Key]" -H "Content-Type: application/json" -d '{"userName": "deadcode", "age": 18"}' https://api.parse.com/1/functions/saveTestRequestParams
-dとして空Jsonにしていましたが、jsonにパラメータをつけました。 返り値は以下の通りです。
# curl -X POST -H "X-Parse-Application-Id: [Application ID]" -H "X-P arse-REST-API-Key: [REST API Key]" -H "Content-Type: application/json" -d '{"userName": "deadcode"}' https://api.parse.com/1/functions/saveTestRequestParams {"result":"done!"}
さて更に言うと、登録した内容(setした内容)を返したい場合があります。 この場合はsave後にsuccess: function(result)としているところに注目です。 resultには登録した内容が返されます。
以下のようにすると返却内容を見ることができます。
Test.save(null, { success: function(result) { response.success(result); }, error: function(error) { response.error(error); } });
上記のように変更して実行してみると返却値は以下のようになります。
# curl -X POST -H "X-Parse-Application-Id: [Application ID]" -H "X-Parse-REST-API-Key: [REST API Key]" -H "Content-Type: application/json" -d '{"userName": "deadcode"}' https://api.parse.com/1/functions/saveTestRequestParams {"reult":{"__type":"Object","age":18,"className":"Test","createdAt":"2015-05-15T09:05:18.498Z","name":"deadcode","objectId":"cMIr47mjEy","updatedAt":"2015-05-15T09:05:18.498Z"}}
登録された内容がそのまま返却されます。 ここで登録した内容の一部 要はnameとageだけを返却したい場合は以下のようにします。
Test.save(null, { success: function(result) { var res = {}; res.userName = result.get("userName"); res.age = result.get("age"); response.success(res); }, error: function(error) { response.error(error); } });
上記のようにすることによって登録した一部の情報を返す事ができます。
レコードの取得(find, first)
では次にsaveした内容をfindしてデータを取得します。 parseではfindとfirstが用意されています。 レコードが一意である場合はfirst, 複数取得する場合はfindを使います。
先ほど取得したデータを取得してみます。 コードは以下の通りです。
/** * get find */ Parse.Cloud.define("getTestFind", function(request, response) { var query = new Parse.Query("Test"); var userName = request.params.userName; query.equalTo("name", userName); query.find({ success: function(results) { var res = {}; res.userName = results[0].get("name"); res.age = results[0].get("age"); response.success(res); }, error: function(error) { response.error(error); } }) });
今回findを使ってのデータ取得ですが saveとの違いはquery部分です。 今回はqueryとしてParse.Queryを使ってテーブル(Class)指定をします。
更にそのqueryでequalToを使って検索しています。 ここに関しては色々と使えるのですが、次の時にでも書きます。
また、success: function(results)として受け取ってるresultsに検索結果が配列で返ってきます。 findに関しては一致するレコードを全て取得します。 今回は1レコードしかないので直接配列の0番目を指定しています。
また、返却されたresultsの値を取る場合はgetを使ってカラム名を指定することによって取得できます。
実行してみましょう。
curl -X POST -H "X-Parse-Application-Id: [Application ID]" -H "X-Parse-REST-API-Key: [REST API Key]" -H "Content-Type: application/json" -d '{"userName": "deadcode"}' https://api.parse.com/1/functions/getTestFind
今回はuserNameを先ほど登録した"deadcode"として指定します。 返り値は以下のようになります。
# curl -X POST -H "X-Parse-Application-Id: [Application ID]" -H "X-Parse-REST-API-Key: [REST API Key]" -H "Content-Type: application/json" -d '{"userName": "deadcode"}' https://api.parse.com/1/functions/getTestFind {"result":{"age":18,"userName":"deadcode"}}
ちゃんと返ってきましたね。 firstについてはCakeと同じように1レコードのみ取得してきます。
コードはfindをfirstに変更するだけです。
また、違いとしてはfindは配列で返ってくるのに対して firstは1レコードだけ持ってくる為、getで取得する時にresuls[0]とfindでは配列のキーを指定していましたが findではresults.getという形で取得します。
レコードの変更
次はレコードを変更してみましょう。 既に登録してあるレコードがあるのでそこを変更します。 変更方法はいくつかあるのですが、以下のようなコードを書きました。
/** * updateTest */ Parse.Cloud.define("updateTest", function(request, response) { var query = new Parse.Query("Test"); query.equalTo("name", request.params.userName); query.first({ success: function(result) { var TestClass = Parse.Object.extend("Test"); var Test = new TestClass(); result.set("age", request.params.age); result.save(); response.success("done!!"); }, error: function(error) { response.error(error); } }); });
手順としてはfirstで変更したいレコードを取得して上書き保存みたいな形で変更しています。 firstで実行して取得したレコードにsetを使ってsaveすることによって上書きができます。
実行してみましょう。
curl -X POST -H "X-Parse-Application-Id: [Application ID]" -H "X-Parse-REST-API-Key: [REST API Key]" -H "Content-Type: application/json" -d '{"userName": "deadcode", "age": 20}' https://api.parse.com/1/functions/updateTest
返り値は以下の通りです。
# curl -X POST -H "X-Parse-Application-Id: [Application ID]" -H "X-Parse-REST-API-Key: [REST API Key]" -H "Content-Type: application/json" -d '{"userName": "deadcode", "age": 20}' https://api.parse.com/1/functions/updateTest {"result":"done!!"}
以上でParseのCloudCodeで保存、取得、変更の基本が完了です。 他にも色々とか書きたい事、やってみたい事があるのですが、それは次の機会にでも。