このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Parse.comとMailGunを普通のWebサイトのバックエンドとして使ってみる

Parse.comは、スマートフォンアプリのためのバックエンド(サーバー側システム)機能を提供するクラウド・サービスのひとつです。このてのサービスは、MBaaS(Mobile Backend as a Service; エムバース)と呼ばれているようです。MBaaSはたくさんありますねー(↓)。

Parse.comの提供する機能のなかには、普通のWebサイト/Webページでも使えるモノがあるので、「それを使ってみよう」という話です。取り上げるのはParse.comの機能の一部だけですが、詳しく説明します。メール送信を話題にするので、APIベースのメールサービスであるMailGunも使います。

内容:

サーバー側機能は自分で作りたくない

静的ページでも十分なWebサイトはけっこう多いと思います。静的ページだけなら、GitHub Pagesなどで無料でホスティングできます。自分でサーバーを運用管理する場合でも、静的ページなら圧倒的にラクチンです。

でも、ちょっとだけ動的機能が欲しくなることはあります。例えばそれがコメント欄なら、Disqusのような、ページ内にJavaScriptコードを貼り付けるだけのサービスで間に合います。しかし、メールフォームになるとクライアント側JavaScriptだけでは難しい。今どき mailto: URIではいくらなんでも…

サーバー側で、HTTP POSTリクエストを受け止めてpostfixなどのMTA(メール転送エージェント)に渡すようなプログラムを書けばいいのですが、それだって随分にめんどくさい。そこで、クラウド型サービスの出番ですよ。

Parse.comは、前述のようにスマートフォンアプリ向けのバックエンド機能を提供しますが、データベース機能とサーバー側でのスクリプト実行機能は汎用性が高いものです。この汎用部分は、Node.js + MongoDB によるバックエンド(サーバー側システム)が最初から準備されている、と思えばいいでしょう。

今回は特に、Parse.comのクラウドコード(Cloud Code)機能を利用します。クラウドコードとは、前もってParseクラウド側に配置したJavaScriptコードで、WebクライアントからHTTP通信により実行できます。

Parseクラウド内にMTA(メール転送エージェント)は備わってないので、外部サービスであるMailGunのメール送信機能をParseクラウドコードから呼び出して使います。

Parse.comのアカウントを作成

https://www.parse.com/signup から無料アカウントを作成できます。このとき、"name of your first app"(最初のアプリの名前)を聞かれます。テキトウな名前でかまいません、後からアプリの追加削除はいくらでも出来ますから。僕は、parseTestというドーデモイイ名前を入力しました。

すぐにクイックスタート(https://www.parse.com/apps/quickstart)の画面にナビゲートされるので、[Cloud Code]を選び、さらに開発環境のOSを選びます。すると、Install the Command Line Tool(コマンドラインツールのインストール)の説明が表示されます。そのまま指示に従ってコマンドラインツールをインストールしましょう。ただし、途中で中断しても、同じことは後からでも出来るので神経質になる必要はありません。

Parseアカウントを取得すれば、アカウント(ユーザー)によらず同じURLで諸々の画面にアクセスできます。URLとそこで行う作業について紹介しておきます。

  1. https://www.parse.com/login -- ログイン画面
  2. https://www.parse.com/apps -- ダッシュボードのトップレベル画面: ここでアプリの選択、アプリの新規作成などを行います。
  3. https://www.parse.com/apps/quickstart -- タスクの選択画面: Parse.comの提供する機能、対象デバイスプログラミング言語、開発環境などを順に選んでいくと、ダウンロードやインストールの指示が表示されます。
  4. https://www.parse.com/apps/<アプリ名><何やらかにやら> -- アプリに関する操作画面: ほとんどの作業はこの画面から行います。

今の我々に必要なものはコマンドラインツールです。クイックスタートを辿らなかった人は、https://github.com/ParsePlatform/parse-cli/releases/ でリリースを列挙できるので、最新のものをダウンロードします。現状の最新版は release_2.2.4 です。コマンドラインツールはGo言語で書かれた単一の実行可能バイナリ(名前はparse)です。

クラウドコード開発環境の準備

Parse.comのデータストア機能は、クラウド側のMonboDBに対してRESTスタイルおよび各種プログラミング言語にバインドされたWeb APIを提供しています。Parseクラウド側に保存されるクラウドコードにより、データストアへのCRUD操作に対するトリガー(フック、アドバイス)を書くことができます。クラウドコードはNode.jsで実行されると想定していいと思います。

データ操作と無関係なJavaScript関数をHTTPにより直接呼び出すこともできます。クラウドコード内に書かれた“外部から呼び出し可能”なJavaScript関数をクラウド関数(cloud function)と呼んでいるようです。

クラウドコードの作成には、コマンドラインツールparse(Windowsならparse.exe)が必要です。ブラウザのParseダッシュボード内でクラウドコードを書いて、その場でテストやデバッグが出来たらいいなー、と思うのですが、残念ながらそうはなってなくて、ローカルでのコンソール作業になります。

次が最初のコンソール作業の例です。parse new で、新規のプロジェクトディレクトリを生成します。bashを使ってますが、OSはWindowsです。アプリケーションIDとREST APIキーが生で表示されるので、そこは伏せ字にしてあります。([追記]伏せ字部分は、機密性がそんな高いわけじゃないですが、各自の環境により違いますよ、という意味の符丁です。[/追記]


$ parse new
Could not find access key for "api.parse.com"
Type "parse configure accountkey" to create a new account key.
Read more at: https://parse.com/docs/js/guide#command-line-account-keys

Please login to Parse using your email and password.
Email: hiyama@chimaira.org
Password (will be hidden):
Would you like to create a new app, or add Cloud Code to an existing app?
Type "(n)ew" or "(e)xisting": e
1: parseTest
Select an App to add to config: 1
Awesome! Now it's time to setup some Cloud Code for the app: "parseTest",
Next we will create a directory to hold your Cloud Code.
Please enter the name to use for this directory,
or hit ENTER to use "parseTest" as the directory name.

Directory Name: Your Cloud Code has been created at C:\Users\hiyama\Work\Parse.com\parseTest.
Next, you might want to deploy this code with "parse deploy".
This includes a "Hello world" cloud function, so once you deploy
you can test that it works, with:

curl -X POST \
-H "X-Parse-Application-Id: ××××××××××××××××××××" \
-H "X-Parse-REST-API-Key: ××××××××××××××××××××" \
-H "Content-Type: application/json" \
-d '{}' \
https://api.parse.com/1/functions/hello

$

以上の作業で次のようなディレクトリ/ファイルが作られます。

parseTest/
 ├── cloud/
 │   └── main.js
 ├── .parse.local
 ├── .parse.project
 └── public/
     └── index.html

クラウドコードを試してみる

先に進む前に、parseコマンドにおけるログインを簡略化するためにアカウントキーを設定しておきます。Parseダッシュボード右上からアカウント設定を開いて(https://www.parse.com/account)、アカウントキーを選んで(https://www.parse.com/account/keys)アカウントキーを生成し、それをコピーしておきます。次のコマンドを実行し、アカウントキーを入力します。


$ parse configure accountkey -d

Input your account key or press enter to generate a new one.
Account Key: ××××××××××××××××××××
Successfully stored default account key.
Successfully stored account key for: "".

$

これで、毎回メールアドレスとパスワードを聞かれることはなくなります。

ここで、parseコマンドが生成した cloud/main.js を見てみましょう。

// Use Parse.Cloud.define to define as many cloud functions as you want.
// For example:
Parse.Cloud.define("hello", function(request, response) {
  response.success("Hello world!");
});

お約束のHello worldですが、これだけでもおよその見当はつきます。

  1. クラウド関数を定義するには、Parse.Cloud.defineを使う。
  2. Parse.Cloud.defineの最初の引数に、クラウド関数の名前となる文字列を指定する。
  3. Parse.Cloud.defineの二番目の引数に、クラウド関数の本体となる関数オブジェクトを指定する。
  4. クラウド関数の本体(コールバック関数)は、requestとresponseという引数を持つ。
  5. 処理が成功したときは、response.successにより値(レスポンスのデータ)を返す。

何の変更も加えず、クラウドにアップロード(配備)しましょう。parse deployを使います。


$ cd parseTest/

$ parse deploy
Uploading source files
Uploading recent changes to scripts...
The following files will be uploaded:
C:\Users\hiyama\Work\Parse.com\parseTest\cloud\main.js
Finished uploading files
New release is named v3 (using Parse JavaScript SDK v1.5.0)

$

上記の例は3回目の配備なのでバージョンがv3になってますが、最初の配備ならv1です。

これで、Parseクラウド内にクラウドコードがセットアップされたので、クラウド関数helloを呼び出すことができます。curlコマンドを使って、REST API経由で呼び出します。


$ curl -X POST \
> -H "X-Parse-Application-Id: ××××××××××××××××××××" \
> -H "X-Parse-REST-API-Key: ××××××××××××××××××××" \
> -H "Content-Type: application/json" \
> -d '{}' \
> https://api.parse.com/1/functions/hello
{"result":"Hello world!"}

$

伏せ字の所には、アプリケーションIDとREST APIキーが入ります。これらの値は、Parseダッシュボードの上部メニュー[Settings]→左サイドメニュー[Keys]から確認できます。

うまくいかないときは、curlコマンドに-vオプションを付けると原因究明に役立ちます。


僕が最初にやったとき、curlによるクラウド関数の呼び出しに失敗しました。-vオプションを付けると、"SSL certificate problem: unable to get local issuer certificate" とメッセージが出てました。httpsで通信するには、curl-ca-bundle.crtというSSL証明書ファイルが必要なんですが、何故かそれがなかったんですね。追加してうまくいきました。

IDやキーの管理

Parse.comを使うには、アプリケーションIDやAPIキーをたくさん使うことになります。いちいちコピペしていては大変なので、環境変数にセットしておくことにします。

# setup-env.sh
export PARSE_APPLICATION_ID=××××××××××××××××××××
export PARSE_REST_API_KEY=××××××××××××××××××××

このようなシェルスクリプトを書いておいて、source ./setup-env.sh します。そうすれば、次のようなテスト用スクリプトを書けます。

#!/bin/sh
# test-cloud-hello.sh
curl -v -X POST \
 -H "X-Parse-Application-Id: ${PARSE_APPLICATION_ID}" \
 -H "X-Parse-REST-API-Key: ${PARSE_REST_API_KEY}" \
 -H "Content-Type: application/json" \
 -d '{}' \
 https://api.parse.com/1/functions/hello

WindowsPowerShellとcmd.exeで同じことをどう行うかも示しておきましょう。シェルごとに微妙な差がありますが、同じことができます。

PowerShell

# setup-env.ps1

$env:PARSE_APPLICATION_ID='××××××××××××××××××××'
$env:PARSE_REST_API_KEY='××××××××××××××××××××'

最初に . .\setup-env.ps1 します。

# test-cloud-hello.ps1
curl.exe -v -X POST `
 -H "X-Parse-Application-Id: $env:PARSE_APPLICATION_ID" `
 -H "X-Parse-REST-API-Key: $env:PARSE_REST_API_KEY" `
 -H "Content-Type: application/json" `
 -d '{}' `
 https://api.parse.com/1/functions/hello

単にcurlとすると、Powershellが持っているcurlコマンド(Invoke-WebRequestの別名)が起動されてしまうので、拡張子.exeを付けます。

cmd.exe

rem setup-env.bat
set PARSE_APPLICATION_ID=××××××××××××××××××××
set PARSE_REST_API_KEY=××××××××××××××××××××

最初に setup-env.bat します。

rem test-cloud-hello.bat
curl.exe -v -X POST ^
 -H "X-Parse-Application-Id: %PARSE_APPLICATION_ID%" ^
 -H "X-Parse-REST-API-Key: %PARSE_REST_API_KEY%" ^
 -H "Content-Type: application/json" ^
 -d {} ^
 https://api.parse.com/1/functions/hello

MailGunのアカウント作成とメール送信テスト

もうひとつのクラウド型サービスであるMailGunのアカウントも作成しましょう。https://mailgun.com/signup のフォームに必要事項を書き込みます。無料(課金なし)で使うのでクレジットカード情報の入力は不要です。ドメイン追加([Add Domain])の手続きもスキップしてかまいません。

フォームのサブミット後に"Activate your Mailgun account to start sending email"という件名のメールが来るので、そのなかのリンクを辿ってアカウントをアクティベートする必要があります

アカウント取得後は、MailGunダッシュボード https://mailgun.com/app/dashboard を使えるようになります。APIキー(秘密キーと公開キー)は、MailGunダッシュボード右下で確認・コピーします。実験に使うサンドボックスドメインは画面中央下に表示されています。

さっそくにメール送信のテストをしましょう。setup-env.shに、メールの受取人アドレス、APIキー、サンドボックスドメインの設定を追加しておきます。

# setup-env.sh
export PARSE_APPLICATION_ID=××××××××××××××××××××
export PARSE_REST_API_KEY=××××××××××××××××××××

export MAIL_RECIPIENT=hiyama@××××××

export MAILGUN_API_KEY=key-××××××××××××××××
export MAILGUN_SANDBOX=sandbox××××××××××××××××

再度 source ./setup-env.sh して、次のテスト用スクリプトを実行します(https://documentation.mailgun.com/quickstart-sending.html#send-via-api 参照)。

#!/bin/sh
# test-mailgun.sh
curl -v --user api:${MAILGUN_API_KEY} \
    https://api.mailgun.net/v3/${MAILGUN_SANDBOX}.mailgun.org/messages \
    -F from="Mailgun Sandbox <postmaster@${MAILGUN_SANDBOX}.mailgun.org>" \
    -F to="${MAIL_RECIPIENT}" \
    -F subject='Hello, this is test mail' \
    -F text='Congratulations, everything is OK.'

MAIL_RECIPIENTに指定されたアドレスにメールが届いていれば成功です。

クラウド関数からのメール送信

前節のメール送信テストでは、curlコマンドを使ってローカルからHTTPリクエストをMailGunに送りました。今度は、Parseクラウド上で実行されるクラウド関数によってMailGunにリクエストしてみましょう。

MailGunのAPIを利用するためのJavaScriptモジュールがParseクラウド準備されています。このクラウド側モジュールを使うことにより、curlコマンドとまったく同じことをしてみます。

cloud/main.js を次のように書き換えます。

var MAIL_RECIPIENT = 'hiyama@××××××';

var MAILGUN_API_KEY = 'key-××××××××××××××××';
var MAILGUN_SANDBOX = 'sandbox××××××××××××××××';
var MAILGUN_API_URL = MAILGUN_SANDBOX + '.mailgun.org';

var mailgun = require('mailgun');
mailgun.initialize(MAILGUN_API_URL, MAILGUN_API_KEY);
 
Parse.Cloud.define("sendTestMail", function(request, response) {
  var from = 'Mailgun Sandbox <postmaster@' + MAILGUN_SANDBOX + '.mailgun.org>';
  var to = MAIL_RECIPIENT;
  var subject = 'Hello, this is test mail';
  var text = 'Congratulations, everything is OK.';

  mailgun.sendEmail(
    {
      to: to,
      from: from,
      subject: subject,
      text: text
    },
    {
      success: function(httpResponse) {
	response.success("Email sent!");
      },
      error: function(httpResponse) {
	console.dir(httpResponse);
	response.error("Uh oh, something went wrong");
      }
    });
})

parse deployします。

クラウド関数sendTestMailを呼び出すには次のスクリプトを実行します。

#!/bin/sh
# test-cloud-sendTestMailsh
curl -v -X POST \
 -H "X-Parse-Application-Id: ${PARSE_APPLICATION_ID}" \
 -H "X-Parse-REST-API-Key: ${PARSE_REST_API_KEY}" \
 -H "Content-Type: application/json" \
 -d '{}' \
 https://api.parse.com/1/functions/sendTestMail

Parseクラウド側でMailGunへのリクエストが発生し、MailGunからメールが送信されます。


$ ./test-cloud-sendTestMail.sh
* Hostname was NOT found in DNS cache
* Trying 54.85.27.106...
* Connected to api.parse.com (54.85.27.106) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: C:\Users\hiyama\Work\bin\curl-ca-bundle.crt
CApath: none
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):

... (省略) ...

* Server nginx/1.6.0 is not blacklisted< Server: nginx/1.6.0< X-Parse-Platform: G1< X-Runtime: 0.081116< Content-Length: 25< Connection: keep-alive<
{"result":"Email sent!"}
* Connection #0 to host api.parse.com left intact

$

Parseダッシュボードの上部メニュー[Core]-左サイドメニュー[Logs]により、クラウド関数の実行ログを参照できます。

I2015-08-31T02:01:20.954Z]v7 Ran cloud function sendTestMail with:
  Input: {}
  Result: Email sent!

クライアント側JavaScriptからのクラウド関数の呼び出し

クラウド関数sendTestMailを呼び出すために手動でcurlコマンドを実行しました。手動curlの代わりにJavaScriptコードで呼び出しを実行してみましょう。

Parse.comは、REST API以外に、各種のプログラミング言語によるクライアント側ライブラリも提供しています(https://parse.com/docs/ 参照)。JavaScriptのライブラリはCDNで配布されているので、次のHTMLタグで利用可能になります。

<script src="https://www.parsecdn.com/js/parse-1.5.0.min.js"></script>

1.5.0はAPIバージョンですが、最新のバージョンは https://parse.com/apps/quickstart#parse_data/web/existing で確認できるようです。

とりあえず、次のようなHTMLファイル(send-test-mail.html)とJavaScriptファイル(send-test-mail.js)を作っておきましょう。

<!-- send-test-mail.html  -->
<html>
  <head>
    <title>Send test mail</title>
    <script src="https://www.parsecdn.com/js/parse-1.5.0.min.js"></script>
    <script src="send-test-mail.js"></script>
  </head>
  <body>
    <button onClick="sendTestMail()">Send test mail</button>
  </body>
</html>
// send-test-mail.js
function sendTestMail() {
  alert("Send test mail")
}

この時点では、HTMLファイルを表示するとボタンが1つだけ現れて、そのボタンを押すとアラートが出るだけです。ボタンを押すと実際に特定の受け取り人アドレスにメールが送信されるようにします。

ドキュメント(https://parse.com/docs/jp/js/guide とか https://parse.com/docs/js/api/symbols/Parse.Cloud.html#.run)を調べてみみると、クラウド関数を呼び出すには次のようにするようです。

Parse.Cloud.run(クラウド関数の名前, クラウド関数に渡すデータ, {
  success: function(result) {
    クラウド関数呼び出しが成功した時の処理
  },
  error: function(error) {
    クラウド関数呼び出しが失敗した時の処理
  }
});

アプリケーションIDとAPIキーを使った初期化も必要なので、send-test-mail.jsを次のように変更します。

// send-test-mail.js
var  PARSE_APPLICATION_ID='××××××××××××××××××××'
var  PARSE_JAVASCRIPT_API_KEY='××××××××××××××××××××'

function sendTestMail() {
  Parse.initialize(PARSE_APPLICATION_ID, PARSE_JAVASCRIPT_API_KEY);

  Parse.Cloud.run("sendTestMail", {}, {
    success: function(result) {
      alert('OK: ' + result);
    },
    error: function(error) {
      alert('Error: ' + error)
    }
  });
}

[Send test mail]ボタンを押してメールが送られるかどうかを確認します。うまくいかないときは、Parse.comのログとMailGunのログを確認します。クラウドコード内で、console.logなどのconsole.*関数が使えるので、それを使って確認やデバッグができます。

問い合わせフォーム

これでメカニズムは分かったので、問い合わせフォームらしくします。文字化けを避けるために、すべてのファイルのエンコーディングutf-8に揃えています。

ソースコードは、https://gist.github.com/m-hiyama/7c8fc61a9eb52437eb22 にも貼り付けてあります。

クラウドコード

// -*- coding: utf-8 -*-
// 注意: ソースコードのエンコーディングは utf-8 にすること。

var MAIL_RECIPIENT = 'hiyama@××××××';

var MAILGUN_API_KEY = 'key-××××××××××××××××';
var MAILGUN_SANDBOX = 'sandbox××××××××××××××××';
var MAILGUN_API_URL = MAILGUN_SANDBOX + '.mailgun.org';

var mailgun = require('mailgun');
mailgun.initialize(MAILGUN_API_URL, MAILGUN_API_KEY);

// テストメールを送る
Parse.Cloud.define("sendTestMail", function(request, response) {
  var from = 'Mailgun Sandbox <postmaster@' + MAILGUN_SANDBOX + '.mailgun.org>';
  var to = MAIL_RECIPIENT;
  var subject = 'Hello, this is test mail';
  var text = 'Congratulations, everything is OK.';

  mailgun.sendEmail(
    {
      to: to,
      from: from,
      subject: subject,
      text: text
    },
    {
      success: function(httpResponse) {
	response.success("Email sent!");
      },
      error: function(httpResponse) {
	console.dir(httpResponse);
	response.error("Uh oh, something went wrong");
      }
    });
})

// 問い合わせフォームを処理する
Parse.Cloud.define("processContact", function(request, response) {
  var name = request.params.name;
  var email = request.params.email;
  var message = request.params.message;
 
  var from ="Mailgun Sandbox <postmaster@" + MAILGUN_SANDBOX +  ".mailgun.org>";
  var to = MAIL_RECIPIENT;
  var subject = "お問い合せ";
  var text = 
      "Name: " + name + "\n"+
      "Email: " + email + "\n"+
      "Message: \n" + message + "\n";

  mailgun.sendEmail(
    {
      to: to,
      from: from,
      subject: subject,
      text: text
    },
    {
      success: function(httpResponse) {
	response.success("Email sent!");
      },
      error: function(httpResponse) {
	console.dir(httpResponse);
	response.error("Uh oh, something went wrong");
      }
    });
});

HTMLファイル

<!-- -*- coding: utf-8 -*- -->
<!-- contact.html  -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>Contact</title>
    <script src="https://www.parsecdn.com/js/parse-1.5.0.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
    <script src="contact.js"></script>

    <style type="text/css">
      .success { color: white; background-color: green;}
      .error { color; yellow; background-color: red;}
    </style>
  </head>
  <body>
    <h1>お問い合せ</h1>
    <form id="commentForm">
      <label for="name">お名前</label>
      <input type="text" name="name" id="name" required><br>

      <label for="email">メールアドレス</label>
      <input type="email" name="email" id="email" required><br>

      <label for="message">メッセージ<br/></label>
      <textarea name="message" id="message" required></textarea><br>

      <input type="submit" value="送信">
    </form>
    <br>
    <div id="response"></div>
  </body>
</html>

JavaScriptファイル

// -*- coding: utf-8 -*- 
// contact.js
var  PARSE_APPLICATION_ID='××××××××××××××××××××'
var  PARSE_JAVASCRIPT_API_KEY='××××××××××××××××××××'

$(document).ready(function() {
  Parse.initialize(PARSE_APPLICATION_ID, PARSE_JAVASCRIPT_API_KEY);	
	
  $("#commentForm").on("submit", function(ev) {
    ev.preventDefault();

    var data = {};
    data.name = $("#name").val();
    data.email = $("#email").val();
    data.message = $("#message").val();

    $('#response').html('').removeClass('success').removeClass('error');
    Parse.Cloud.run("processContact", data, {
      success:function(result) {
	$('#response').html('送信成功').
	  addClass('success').fadeIn('fast');
      },
      error:function(error) {
	console.dir(error);
	$('#response').html('送信失敗:エラーが生じました').
	  addClass('error').fadeIn('fast');
      }
    });
  });
});

使ってみての感想

手順はけっこうめんどくさいですが、環境をすべて自分で準備することに比べれば格段に楽です。Parse.comもMailGunもダッシュボード(管理画面)が使いやすいので、シェルログインしてゴニョゴニョするより快適。

Parse.comのバックエンドは、基本的にJSONデータを返します。ですから、JSONベースのAjaxサーバーとしてはParse.comがピッタリでしょう。一方、サーバー側でHTMLを生成してページ遷移を引き起こす用途には向いていません。

Ajaxとは限らない一般的な動的サイトのために、Parse.comではWebサイトのホスティングもやっています。ローカルでのparseコマンド実行により作られたプロジェクトディレクトリのpublic/サブディレクトリにHTMLページを置くと、それも配備可能なのです。Expressフレームワークを使って動的サイトが作れるようです(https://parse.com/docs/jp/js/guide#hosting 参照)。

今回は使いませんでしたが、MongoDBベースのデータストアは色々と使い出がありそうです。

不満な点は、クラウドコードのテスト・デバッグが不便なことです。ローカルの実行環境がないので、アップロードしてはクラウド側で実行となるので、嫌になりますね。ダッシュボードにコード編集を含むちょっとしてIDE機能も欲しいところ。

デバッグ用ローカルプロキシとして https://github.com/mariusciocan/parse-cloud-debugger がありますが、こういうのはParse.com本家がサポートすべきでしょう。

ともかくも、スマートフォンアプリと無関係な場面でもMBaaSを利用できることが分かりました。「サーバーサイドやりたくねーな」と思ったときの候補のひとつになりますよ。