2013年5月2日木曜日

Parse.com の Cloud Code ハマりどころ

Parse.comのCloud Codeを触っていてハマった点や気づきにくい仕様を列挙させて頂きます。

■Parse.Cloud.useMasterKeyを呼び出すことで特権ユーザー権限になれる

Cloud Code上でACLによるアクセス制限を無視して現在のrequest.userとは関係なしにデータを操作したいということが多々あるかと思います。そのような場合は以下のようにリクエスト処理の先頭でParse.Cloud.useMasterKeyメソッドを呼び出してください。
Parse.Cloud.beforeSave(Parse.Role, function(request, response) {
Parse.Cloud.useMasterKey();
var role = request.object;
if (user_js.isAdministratorRole(role)) {
if (role.isNew()) {
// Administrator role creation
// Set ACL on create
var administratorRoleACL = new Parse.ACL();
administratorRoleACL.setPublicReadAccess(false);
administratorRoleACL.setPublicWriteAccess(false);
administratorRoleACL.setRoleReadAccess(user_js.kAdministratorRoleName, true);
administratorRoleACL.setRoleWriteAccess(user_js.kAdministratorRoleName, true);
role.setACL(administratorRoleACL);
response.success();
} else {
// Administrator role update
// Do nothing
response.success();
}
}
});
view raw gistfile1.js hosted with ❤ by GitHub

useMasterKeyの効果は呼び出された瞬間からリクエストが終了するまで有効です。

■Parse.Cloud.beforeSaveやParse.Cloud.afterSaveはData Browserから直接Rowを追加した場合にも呼び出される

これは意外とハマりどころです。例えばData BrowserからUserを追加した時などにUserに対してつけておいたParse.Cloud.beforeSaveが発動するなどしてよく発生します。Data Browserから直接Rowを追加した場合、request.userはnullになりますので注意してください。また追加元がData Browserなのか普通のクライアントなのかを判定する手段が用意されていないため、処理を分岐させたくなるととたんに話が面倒なことになります。