今年原定公司要開發 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 基本需求:
- Node.js 4.1 以上
- Mongodb 2.6.x OR 3.0.x
- 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"}
- 測試 Parse Cloud Server
返回 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 GG (2) 自架土炮 Parse Server