先日リリースされたスクリプト機能を使ってデータの検証(バリデーション)を行ってみます。使い道としては以下が考えられます。
- 必須の入力項目、数字のみと言ったデータの登録/更新前の検証
- ゲームにおけるチート対策
今回はItemクラスでnameプロパティを必須として判定するスクリプトを作ってみます。
スクリプトのアップロード
サーバにアップロードするコードは次のようになります。サーバ側でのJavaScript SDKを読み込んでNCMBオブジェクトを作る必要がある点に注意してください。
var NCMB = require('ncmb'); module.exports = function(req, res) { // ニフティクラウド mobile backendの設定 var application_key = 'YOUR_APPLICATION_KEY'; var client_key = 'YOUR_CLIENT_KEY'; var ncmb = new NCMB(application_key, client_key); // データストアの用意 var Item = ncmb.DataStore('Item'); // 送られてきたデータでインスタンス生成 var item = new Item(req.body.item); // 入力値の判定 if (emptyString(item.get("name"))) { return res.status(400).json({ error: "Name is required." }); } // 保存処理を実行 item.save() .then(function(obj) { return res.status(201).json(obj); }) .catch(function(err) { return res.status(503).json(err); }); }; // 入力値の判定用 function emptyString(value) { if (typeof value === 'undefined') return true; if (value === null) return true; if (value === "") return true; return false; }
次にクライアントアプリ側です。今回はJavaScript SDKを使っています。
function onReady() { var application_key = 'YOUR_APPLICATION_KEY'; var client_key = 'YOUR_CLIENT_KEY'; var ncmb = new NCMB(application_key, client_key); var Item = ncmb.DataStore('Item'); var item = new Item(); // 成功する場合:item.set("message", "Hello World").set("name", "Test"); // 失敗する場合 item.set("message", "Hello World"); ncmb.Script .data({"item": item}) .exec("POST", "ItemSave.js") .then(function(res){ // 実行後処理 console.log('Item saved successful.', res); }) .catch(function(err){ // エラー処理 console.error('Item save failed.', err); }); } document.addEventListener("DOMContentLoaded", onReady, false);
注意する点としては、 item.save
ではなく、スクリプトを呼び出しているということです。また、データとしてitemを送っています。このデータは req.body.item
として受け取れます。メソッドも忘れずに指定してください。もし何のデータもセットせずに送った場合、 req.body.item は {} となります。
そして、サーバ側でバリデーションを行った上で、もしエラーであればエラーを返しています。
if (emptyString(item.get("name"))) { return res.status(400).json({ error: "Name is required." }); }
HTTPステータスは400を指定しているので、アプリ側でもエラーとして取得できるようになります。今回はメッセージだけですが、エラー項目をデータとして渡してあげれば入力欄を赤くすると言った処理につなげられるでしょう。
エラーでない場合は単にthen処理につながりますので、item.save
と変わらない使い方ができます。
このようにサーバ側にコードを持たせることでiOS/Android間の共通コードをサーバ側で処理するようにしたり、データへ独自のチェックデジットを設けておいて、それをサーバ側でも同様に検証することでチート対策ができるようになります。
ぜひスクリプト機能をお試しください!