Site icon Mr. 沙先生

Parse.com 停止服務? 建立自己的 Parse API Server 吧! – 建立 Parse Server『Part1』

今年原定公司要開發 App,必須要擁有一台 Push Notifications Server,剛好 Facebook 於 2016年1月28日,在宣布關閉 Parse.com 平台服務的同時也提供了 PrasePlatform Source code,趁這個機會也將來測試這個頗為熱門的 App cloud database

 

Parse.com 提供的主要服務為推播訊息、雲端資料庫

 

Parse 系統架構是採用 NodeJS、MongoDB、其特色是跨平台iOS/OSX/Android/Unity/.NET  .. 等等各種 API

基於種種考量,我還是習慣使用自己掌握的住的服務,而不是使用大型服務商所提供的服務,為的就是避免這種大型營運商突然停止服務的狀況,逼的自己必須緊急尋找替代方案,在時間的逼迫下容易迫使無法考量好各種需求,尤其是系統這種東西並不是說更換就能夠更換的,影響到的並不是單一產品,而可能是整間公司的營運。

 

其實在建立 parse 的過程中也花了兩三天的時間去了解,以目前的資料來說,並不算齊全,在功能上比起營運商所提供的服務減少了許多,目前算是 OpenSource 的陣痛期,相信之後會有越來越多的開發功能可以使用

 

Parse Server 的部分會拆開幾篇來寫,本篇將紀錄安裝 Parse Server 環境

 

Parse Server 基本需求:

  1. Node.js 4.1 以上
  2. Mongodb 2.6.x OR 3.0.x
  3. Python 2.x

 

Parse Server 建立

Step.1 首先,由於 LAB 環境於 CentOS 6.7,所以必須先處理基本套件版本的問題

MongoDB 目前選擇的是 2.6 版本,採用官方 repo 的方式安裝

$ vim /etc/yum.repo.d/mongodb-org-2.6.repo

[mongodb-org-2.6]
name=MongoDB 2.6 Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

$ yum install -y mongodb-org-server mongodb-org
$ service mongod start

#建立super user
$ mongo
> use admin
> db.createUser( { user: "sa", pwd: "sa_pwd", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } );

#建立資料庫:parse , User:parse_user , PWD:parse_pwd
$ mongo
> use parse
> db.createUser( { user: "parse_user", pwd: "parse_pwd", roles: [ { role: "dbOwner", db: "parse" } ] } ;
> show dbs
admin 0.078GB
local 0.078GB
parse 0.078GB

#驗證帳號密碼,正確回傳1
> db.auth('parse_user','parse_pwd')
1

#若沒有建立 root 使用者,請在 admin 先行建立,否則底下將開啟 auth mode
$ vim /etc/mongod.conf
auth=true

$ service mongod restart

#測試mongodb auth mode
$ mongo
> show dbs

016-02-18T23:33:12.460+0800 listDatabases failed:{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" : 13
} at src/mongo/shell/mongo.js:47
#因為沒有登入,所以無法 show dbs

 

Step.2 安裝 Parse Server、建立新專案

這邊我選擇用 Express Generator 來建立 Express 專案

$ npm install express-generator -g

#專案名稱 shazi-parse
$ express shazi-parse

#安裝 npm module
$ cd shazi-parse
$ npm install

#安裝 parse-server module
$ npm -i parse-server --save

 

Step.3 修改 app.js 主程式設定

加入 parse-server 模組

$ vim app.js

var ParseServer = require('parse-server').ParseServer;

 

建立 ParseServer instance

// Specify the connection string for your mongodb database
// and the location to your Parse cloud code
var api = new ParseServer({
    databaseURI: 'mongodb://parse_user:parse_pwd@localhost:27017/parse',
    cloud: '/root/shazi-parse/cloud/main.js', // Provide an absolute path
    appId: '8d5e8254dc8372c0635b3a83d3d57eea',
    masterKey: 'mySecretMasterKey',
    fileKey: 'optionalFileKey',
    resAPIKey: '9da7b77c8be23dafb5d339ce7dc5087d'

databaseURI = mongodb 的 URL 連接資訊

 

cloud = Parse Cloud code 的程式碼路徑,可以預先建立一隻 main.js 如下

Parse.Cloud.define("hello", function(request, response) {
  response.success('hello');
});

 

appId = 是 Parse API 的使用權限,之後的溝通都必須使用這個 Application ID,可以使用 md5 建立一組

$ echo "md5_pwd" | md5sum
8d5e8254dc8372c0635b3a83d3d57eea

 

masterKey = 自定義 masterKey

fileKey = 自定義 fileKey

resAPIKey = 同 appId

 

Step.4 啟動 Node.js

$ npm start

parse@0.0.0 start /root/parse
> node ./bin/www
(node) child_process: options.customFds option is deprecated. Use options.stdio instead.

 

Step.5 API 測試

使用 curl 來測試,建立一個 curl script

$ vim inparse-curl

curl -X POST \
-H "X-Parse-Application-Id: 7717a2bf5e2cfacb8063ab3bb0df4468" \
-H "X-Parse-REST-API-Key: 9da7b77c8be23dafb5d339ce7dc5087d" \                                                          
-H "Content-Type: application/json" \
-d '{"score":1337,"playerName":"Sean Plott","cheatMode":false}' \
http://localhost:3000/parse/classes/GameScore

$ chmod +x parse-curl

 

返回 mongodb ID ,  createdAt 訊息代表成功建立資料

$ ./inparse-curl 
{"objectId":"977rm2zdkI","createdAt":"2016-02-19T03:24:43.788Z"}

 

資料驗證

既然 curl 可以傳入資料信息,也可以取出

$ outparse-curl
curl -H "X-Parse-Application-Id: 7717a2bf5e2cfacb8063ab3bb0df4468" \
http://localhost:3000/parse/classes/GameScore

$ chmod +x outparse-curl && ./outparse-curl
{"objectId":"977rm2zdkI","createdAt":"2016-02-19T03:24:43.788Z"}

 

返回 hello 功能正常!

$ cloud-parse

curl -X POST \
-H "X-Parse-Application-Id: 7717a2bf5e2cfacb8063ab3bb0df4468" \
-H "Content-Type: application/json" \
-d '{}' \
http://localhost:3000/parse/functions/hello

$ chmod +x cloud-parse && ./cloud-parse
{"result":"hello"}

 

既然是寫入資料庫,資料庫應該也必須查詢的到

$ mongo
> use parse
> db.auth('parse_user','parse_pwd')
1

#先看建立了哪些 collection
> db.getCollectionNames()
[ "GameScore", "_SCHEMA", "system.indexes" ]

#剛剛建立的 GameScore 已經出現了,查查剛剛鍵入的資料
> db.GameScore.find()
{ "_id" : "977rm2zdkI", "score" : 1337, "playerName" : "Sean Plott", "cheatMode" : false, "_updated_at" : ISODate("2016-02-19T03:24:43.788Z"), "_created_at" : ISODate("2016-02-19T03:24:43.788Z") }

注意從剛剛測試的 id 都是同一筆,在 mongodb 都是採用獨一無二的 id key,資料都正確 Parse Server 的建立就告一段落!

 

 

 

 

 

 

 

參考資料:

Parse Server Guide

如何自行架設 Parse API Server

Parse GG (2) 自架土炮 Parse Server

Exit mobile version