Server Code の例

ここでは、次の例を示します。

想定する実行方法 同期的/非同期的
クライアントにサーバーのタイムスタンプを送信 手動実行 同期的
クライアントより渡されたパラメータを使って新規アカウントを作成 手動実行 非同期的
REST 経由で ObjectBody を利用 手動実行 非同期的
新規ユーザーに自動的にアイテムを追加(サーバートリガー起動) サーバートリガー 非同期的
ログの記録(スケジュール起動) スケジュール 非同期的

その他、実装上のヒント として、以下のサンプルコードを用意しています。

Server Code の開発にはいくつかの制限事項があります。制限事項 を参照してください。

クライアントにサーバーのタイムスタンプを送信

以下に、同期的に書かれた Server Code の例を挙げます。この例では、Server Code がログインユーザーによって実行されたかを確認して、サーバーのタイムスタンプをクライアントに返信しています。

function server_time(params, context) {
  if (context.getAccessToken()) {
    // The Code is invoked by a logged-in user.
    return Date.now().toString();
  } else {
    return "Sorry, we don't allow an anonymous user to get the timestamp";
  }
}

この例では既定パラメータより getAccessToken メソッドを用いてアクセストークンを取得し、これを元に Server Code がログイン済みユーザーと匿名ユーザーのいずれによって実行されたのかを判定しています。ログイン済みによる実行であった場合のみ、サーバーのタイムスタンプをクライアントに返しています。

クライアントより渡されたパラメータを使って新規アカウントを作成

次に、非同期的に書かれた Server Code の例を挙げます。この例では、クライアントより実行時パラメータとして渡されたユーザー名とパスワードを用いてユーザー登録処理を行っています(たとえば友人の代わりに新規アカウント作成を代行するケースなどを想定)。

function main(params, context, done) {
  var user = KiiUser.userWithUsername(params.username, 
                                      params.password);
  user.register({
    success: function(user) {
      done(user.getUsername());
    },
    failure: function(user, errorString) {
      done(errorString);
    }
  });
}

ここでは以下の処理が行われています。

  • KiiUser.userWithUsername メソッドを実行して新規アカウントを作成しています。この際、クライアントより実行時パラメータとして渡されたユーザー名とパスワードを第 1 引数を用いて取得しています。
  • 第 3 引数として渡されたコールバック関数 done を用いて、作成したアカウントのユーザー名をクライアントに返しています。

REST 経由で Object Body を利用

次に、Kii Cloud の REST API によって、Object Body をダウンロードする例を挙げます。この例では、REST API を使って外部サーバーを呼び出す処理と、Server Code 上で Object Body を扱う処理を示します。

Server Code では、jQuery を使って、外部のサーバーを呼び出すことができます。今回の例は、Kii Cloud 自身ですが、アクセスできるドメインに制限はないため、外部のサーバーに接続して、その結果から処理を行うこともできます。

また、現状の Server Code では、Object Body を利用する際に必要な Blob や FileReader をサポートしていないため、Server Code から Object Body を利用したい場合は REST API を使う必要があります。

この例では、bucketName パラメータと、objectId パラメータで指定された、アプリケーションスコープの Object にある Object Body を参照しています。取得した Object Body そのものは特に処理していません。

function parse_body(params, context, done) {
  var appId = context.getAppID();
  var appKey = context.getAppKey();
  var adminToken = context.getAppAdminContext()._getToken();
  var targetUrl = Kii.getBaseURL() + "/apps/" + appId + "/buckets/" + params.bucketName + "/objects/" + params.objectId + "/body";
  $.ajax({
    url: targetUrl,
    type: "GET",
    headers: {
      "Accept": "*/*",
      "Authorization": "Bearer " + adminToken
    },
    success: function(body) {
      // doing something with body
      done("OK");
    },
    error: function(msg) {
      done("NG:" + JSON.stringify(msg));
    }
  });
}

拡張のヒント

  • 今回の例は HTTP GET を利用していますが、$.ajaxtype を他のメソッドに変更することもできます。変更する際は、メソッド名の大文字小文字にご注意ください。たとえば、"Post" では正しく動作しません。

  • REST のリクエストで JSON オブジェクトを渡したい場合、$.ajaxdata(HTTP BODY 指定)では、JSON.stringify({"param" : "value"}) のように stringfy メソッドを使用します。

  • この例ではダウンロードの例をあげていますが、この例を参考にしてクライアントから渡されたデータをアップロードする処理を記述する場合は、Server Code に渡すパラメータのサイズに注意してください。パラメータ本体と Server Code を呼び出すためのメタ情報(50 バイト程度)を、合計 100KB 以内に収める必要があります。

新規ユーザーに自動的にアイテムを追加(サーバートリガー起動)

次に Server Hook により自動起動されることを想定した Server Code の例を挙げます。この例は、新規ユーザーが作成されたタイミング(i.e. USER_CREATED トリガーが発生した時。トリガーの詳細は こちら を参照)で、ユーザーの "gifts" Bucket にランダム選択されたプレゼントアイテムを追加しています。 例では done コールバック関数の引数を省略しています。これは Server Code が Server Hook により起動された場合、実行結果をクライアントに返すことができないためです。

function main(params, context, done) {
  var admin = context.getAppAdminContext();
  var user = admin.userWithID(params.userID);

  // Gift for a new user.
  var selectedGift = getSignUpGift();
  var giftObject = user.bucketWithName("gifts").createObject();
  giftObject.set("name", selectedGift["name"]);
  giftObject.set("imageUrl", selectedGift["imageUrl"]);
  giftObject.save({
    success: function(targetObj) {
      done();
    },
    failure: function(targetObj, error) {
      done();
    }
  });
}

function getSignUpGift() {
  var gifts = [{
    "name": "Normal axe",
    "imageUrl": "http://example.kii.com/yyy/axe.png",
    "hitRate": 70
  }, {
    "name": "Silver axe",
    "imageUrl": "http://example.kii.com/yyy/saxe.png",
    "hitRate": 20
  }, {
    "name": "Golden axe",
    "imageUrl": "http://example.kii.com/yyy/gaxe.png",
    "hitRate": 10
  }];


  var random = Math.floor(Math.random() * 100);
  var range = 0;
  var selectedGift = gifts[0];
  for (var i=0; i<gifts.length; ++i) {
    range += gifts[i]["hitRate"];
    if (random < range) {
      selectedGift = gifts[i]; 
      break;
    }
  }
  return selectedGift;
}

この例では、まず getAppAdminContext を使いアプリ管理者のコンテキストを取得、params.userID を使い新たに作成されたユーザーの ID を取得しています。この ID を使って userWithID メソッドを実行して KiiUser インスタンスを作成した後に bucketWithName メソッドでユーザーの "gifts" Bucket をインスタンス化し、この中にアイテムに相当する Object を保存しています。

ログの記録(スケジュール起動)

Server Hook により自動起動されることを想定した Server Code の例をもう 1 つ挙げます。この例は、スケジュール起動(詳しくは こちら を参照)することを想定しています。

function sendDailyMessage(params, context, done) {
  // Print a log with the passed JSON parameters.
  console.log("Exec send w/ params " + JSON.stringify(params)); 
  done("CRON EXECUTED");
}

上記 Server Code は、渡された実行パラメータ(Server Hook 設定ファイルに指定されたパラメータ)を含む実行ログを記録します。