實時開發框架Meteor API解讀系列Publish and Subscribe-(1)

寫在前面的話

  1. 本篇博客主要講 publish和subscribe
  2. 使用的meteor版本爲0.7.0.1
  3. 本篇博客主要是完善以前寫過的一篇博客Meteor中subscribe和publish簡單介紹
  4. 老話重提 ,儘量以官方文檔爲主
  5. 本篇博客有不正確的地方在所難免,如有發現望指出。
  6. 本篇博客涉及到另外一個知識點 Collection,不會詳說,將作爲獨立的博客進行說明。

功能

主要是控制服務端如何向客戶端推送數據,以及客戶端如果接收數據集

publish Server

首先,在你實驗這個函數之前 你應該移除meteor默認的一個包 autopublish

meteor remove autopublish

這個包的作用是自動推送你定義的所有數據集到客戶端。這樣做的一個好處是,方便新接觸meteor的新手,因爲它不需要進行更多的配置,不需要處理publish和subscibe函數。自然好處是相對的,在實際開發過程中,據的權限等方面都要求我們對客戶端獲取的數據集進行精確的控制。這就是publish和subscribe所要實現的功能了。

collection

在推送數據集的之前,首先需要定義數據集,也就是連接mongodb中的某個數據集,如果該數據集不存在,則會自動創建一個空的數據集。 定義數據集很簡單:

PeopleCollection = new Meteor.Collection("people");

注意這裏的people就是mongodb中的數據集的名稱。在初始化應用後,你可以連接mongodb,用shell查看是否存在這個數據集。因爲這個數據集將在客戶端和服務端同時使用,請確保這個定義位於 server和client文件夾之外(其他的public更不用說了,文件夾的作用在前面的博客(<二>)已經提到過了)。我的做法一般是在應用的根目錄下新建一個conllection.js專門用來聲明數據集。這裏的的PeopleCollection對象 就可以操作這個people數據集了。請注意因爲數據集對象PeopleCollection是在客戶端和服務端同時使用的,所以確保定義的時候不要加var 這個涉及到了Meteor中的作用域了,各中原因以後專門一篇博客講述。這裏稍微提一下,用var定義的變量只存在於文件作用域。跨文件不可用。這一點和普遍html中的js不同。另外在對於數據集對象命名時 個人建議變量帶有特殊的單詞 以便與其他類型的變量區別開來,也避免在不經意間造成變量的重複命名。我的個人習慣是數據集對象以Collection結尾,如:XXXCollection

publish

publish函數 在服務端進行使用。它具體說明如下:

publish(name,func)
//name:數據集的名字,數據類型 string,必需。 
//func:回調函數,控制發佈到客戶端的數據集內容,或進行數據二次處理
它可以接受一個或多個參數來自客戶端的參數。當然函數本身this也帶有一些其他屬性。後文將說到。

解釋了這些,其實不如一段代碼來的清晰。注意每次代碼前我都會標註一下文件組織結構格式,以|--表示下一層目錄。以-表示應用根目錄。用fold表示文件夾,file表示文件。(其實 沒帶後綴的就是文件夾帶了後綴的就是文件)

-
--server #fold
    |-- startup.js #file
    |-- publish.js #file
--collection.js #file

collctions.js

PeopleCollection = new Meteor.Collection("people");###聲明數據集

startup.js 初始化一些數據。如果不明白函數是幹什麼用的不要緊。後面的博客將會說。這裏是在啓動時mongodb中的people數據集加入一些數據進去,以便我們測試demo

Meteor.startup(function(){ //應用啓動時,初始化一些數據進去people集合
    if(PeopleCollection.find().count() != 0){
        return;
    }
    //這裏的 PeopleCollection 使用的就是collections.js中定義的數據集操作對象
    var peoples = [
        {name:"小A",address:"長沙",phone:"111"},
        {name:"小B",address:"常德",phone:"222"},
        {name:"小C",address:"衡陽",phone:"333"},
        {name:"小D",address:"衡南",phone:"444"},
        {name:"小E",address:"株洲",phone:"555"}
    ];
    for (var i = 0; i < peoples.length; i++)
        PeopleCollection.insert(peoples[i]);
});

publish.js

//向客戶端發佈集合  第一個參數爲集合的名字,隨意取,但是我們一般取與後臺定義集合相同的名字,如果```new Meteor.Collection("people")```用的是people,那麼這裏也用people;。當然如果爲了保密性和安全性,可以隨意取,我們做測試加個後綴_safe。只要保證返回的結果集是你想返回的就可以了。
//第二個參數,是一個函數,當客戶端需要傳參數進來時可以通過此函數,參數可以是多個,不限於當前舉例的2個
Meteor.publish("people_safe", function (arg1,arg2) {
  console.log(arg1+ar2);
  console.log(arguments);
  return PeopleCollection.find({})
});

現在把這個demo跑起來。

meteor remove autopublish  #先把自動數據推送包給移除
meteor #運行meteor

啓動後打開瀏覽器http://localhost:3000/ 界面上什麼都沒有。沒關係,我們前面什麼都沒有添加,是這樣的。現在打開chrome控制檯,前面的博客提到過使用控制檯。輸入

PeopleCollection.find({}).fetch()

返回一個空的數組。這是因爲我們雖然在服務端進行了數據的推送,但是我們沒有在客戶端進行數據的訂閱。所以客戶端沒有任何數據。現在來看客戶端的訂閱數據函數。現在先關閉瀏覽器並停止應用。

subscribe Client

主要是訂閱設置接收服務端的數據

Meteor.subscribe(name [, arg1, arg2, ... ] [, callbacks])

name:設置要獲取的服務端定義推送的數據集。也就是在Meteor.publish的第一個參數是什麼,那麼你接受該publish推送的數據時也應該用什麼。 必需。

[arg1,arg2,...] 是可選參數。用來傳遞給  服務端publish函數的第二個參數回調函數 做參數。有點羅嗦,等下看代碼就很清楚了。

callbacks  是客戶端拿到數據後 可以執行的回調函數。

看代碼,現在應用結構是:(新增了一個文件夾啊)

--server #fold
    |-- startup.js #file
    |-- publish.js #file
--client #fold
    |-- subscribe.js
--collection.js #file

subscribe.js

//這裏傳兩個參數過去
Meteor.subscribe("people_safe",1,"hello world",function(){
    console.log("數據訂閱完成");
});

重新啓動應用。 
這時在瀏覽器還沒有訪問時,沒有任何輸出,因爲沒有任何客戶端存在,現在打開瀏覽器訪問應用http://localhost:3000/ 
這時在服務端後臺會馬上看到傳遞過去的參數打印出來。同時打開瀏覽器控制檯,同樣會看到subscribe的回調函數有執行。 
然後我們在瀏覽器的控制檯再次運行(小技巧:可以按上下方向鍵調出輸入歷史,避免每次都進行輸入)

PeopleCollection.find({}).fetch()

這時就有數據打印出來了。

到這裏就簡單介紹了一下數據的定義,推送,訂閱流程。更詳細的內容,我將在下一篇博客進行說明。 
文中源碼可以到這裏http://download.csdn.net/detail/a6383277/7110137下載。

源碼使用說明:
因爲打包的源碼中沒有包括mongodb數據庫文件(這些文件太大了,所以沒有打包經來),需要進行一定的操作後代碼才能正常運行
1.下載拿到壓縮文件後,解壓。
2. 在你的工作目錄下新建一個工程如:
meteor create api003
進入到api003目錄下,剪切.meteor文件夾到解壓後的文件夾裏。注意在linuxmac 下,.meteor可能是隱藏的。通過ctrl+H可以讓它顯示出來。window下則不會隱藏。
這是就可以運行了。有任何問題可以在博客下方留言
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章