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/fc-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 Server Guide
如何自行架設 Parse API Server
Parse GG (2) 自架土炮 Parse Server
Orignal From: Parse.com 停止服務? 建立自己的 Parse API Server 吧!
沒有留言:
張貼留言