微信開(kāi)發(fā)-技術(shù)文檔(2)10.16-10.23

使用shell腳本快速啟動(dòng)mongodb

  1. 在根目錄下新建腳本并命名. eg.
touch mongodb.sh
  1. 使用vi編輯器在腳本中添加自定義的shell命令
vi mongodb.sh

在文件中添加mongodb啟動(dòng)命令

mongod --dbpath /usr/local/Cellar/mongodb/3.2.7/data/db

保存退出仑氛,啟動(dòng)shell腳本

./mongodb.sh

socket.io 原理理解總結(jié)

socket.io命黔,是一個(gè)使用反向ajax方法處理數(shù)據(jù)的庫(kù)阵苇。獲取數(shù)據(jù)碟案,模擬一個(gè)ajax請(qǐng)求向服務(wù)器發(fā)送數(shù)據(jù)。
為基于nodejs的web應(yīng)用,創(chuàng)建一個(gè)本地服務(wù)器(專用于本個(gè)web應(yīng)用):
Server端:

var express = require('express')    , app = express()    , server = require('http').createServer(app)    , io = require('socket.io').listen(server);      //監(jiān)聽(tīng)服務(wù)器靡努,監(jiān)聽(tīng)通過(guò)該Server的連接信息,而非監(jiān)聽(tīng)sockets

在用戶端讼油,為每一個(gè)(通過(guò)登錄驗(yàn)證)登入聊天頁(yè)面的用戶杰赛、即意圖連接本地服務(wù)器的用戶,創(chuàng)建一個(gè)socket矮台,分配唯一的socketID乏屯,所有用戶獨(dú)立的socket之間的通訊都建立在Server端的本地服務(wù)器中。

Client端:


var socket = io.connect('http://localhost');       //獲取socket對(duì)象瘦赫,并且通過(guò)這個(gè)socket收發(fā)事件
//var socket = io.connect('網(wǎng)站地址或ip');

summary

本地服務(wù)器:socket == 一對(duì)多的關(guān)系

socket:登入用戶 == 一對(duì)一的關(guān)系

服務(wù)器端:接受字符串"action"作為客戶端發(fā)起連接的事件辰晕,當(dāng)連接成功后,調(diào)用帶有socket參數(shù)的回調(diào)函數(shù)确虱,處理用戶的請(qǐng)求含友。
客戶端:發(fā)起連接到指定服務(wù)器,并且傳入當(dāng)前socket對(duì)象。

事件綁定

  1. click 窘问,點(diǎn)擊觸發(fā)
  2. focus辆童,聚焦觸發(fā)
  3. blur,失焦觸發(fā)
  4. 回車(chē)綁定

Socket.IO內(nèi)置的默認(rèn)事件

服務(wù)器端事件

  • io.sockets.on('connection',function(socket) {})
    :socket連接成功之后觸發(fā)惠赫,用于初始化
  • socket.on('message',function(message, callback) {})
    :客戶端通過(guò)socket.send
    來(lái)傳送消息時(shí)觸發(fā)此事件把鉴,message為傳輸?shù)南ⅲ琧allback是收到消息后要執(zhí)行的回調(diào)
  • socket.on('anything',function(data) {})
    :收到任何事件時(shí)觸發(fā)
  • socket.on('disconnect',function() {})
    :socket失去連接時(shí)觸發(fā)(包括關(guān)閉瀏覽器儿咱,主動(dòng)斷開(kāi)庭砍,掉線等任何斷開(kāi)連接的情況)

客戶端事件
connect:連接成功
connecting:正在連接
disconnect:斷開(kāi)連接
connect_failed:連接失敗
error:錯(cuò)誤發(fā)生,并且無(wú)法被其他事件類型所處理
message:同服務(wù)器端message事件
anything:同服務(wù)器端anything事件
reconnect_failed:重連失敗
reconnect:成功重連
reconnecting:正在重連

客戶端觸發(fā)順序:
第一次連接時(shí)混埠,事件觸發(fā)順序?yàn)椋篶onnecting->connect怠缸;
當(dāng)失去連接時(shí),事件觸發(fā)順序?yàn)椋篸isconnect->reconnecting(可能進(jìn)行多次)->connecting->reconnect->connect岔冀。

Socket.io各個(gè)發(fā)送消息的含義


// send to current request socket client
socket.emit('message', "this is a test");
// sending to all clients, include sender
io.sockets.emit('message', "this is a test");
// sending to all clients except sender
socket.broadcast.emit('message', "this is a test");
// sending to all clients in 'game' room(channel) except sender
socket.broadcast.to('game').emit('message', 'nice game'); 
// sending to all clients in 'game' room(channel), include senderio.sockets.in('game').emit('message', 'cool game');
// sending to individual socketid
io.sockets.socket(socketid).emit('message', 'for your eyes only');
// 進(jìn)入一個(gè)房間
socket.join('room');
// 離開(kāi)一個(gè)房間
socket.leave('room');

發(fā)送消息給指定客戶端方法

io.sockets.connected[socketid].emit();
io.to(socket.id).emit();
socket.emit();

發(fā)送消息原理

  1. 客戶端向服務(wù)器發(fā)送任意類型消息凯旭。
socket.send();
  1. 服務(wù)器接收消息數(shù)據(jù),執(zhí)行“message”對(duì)應(yīng)的回調(diào)函數(shù)使套。
socket.on('message', function(){});

服務(wù)器將接收到的信息保存到數(shù)據(jù)庫(kù)中罐呼,并且把消息轉(zhuǎn)發(fā)到sender客戶端、receiver客戶端侦高。

io.to(sender).emit('msg',sender, receiver, msg);io.to(receiver).emit('msg',sender, receiver, msg);
  1. 客戶端接收服務(wù)器端發(fā)來(lái)的消息嫉柴,在前端頁(yè)面顯示消息div。
socket.on('msg', function (sender, receiver, msg) {// $("div").append("<div>動(dòng)態(tài)創(chuàng)建div</div>") //動(dòng)態(tài)創(chuàng)建代碼塊 console.log("傳遞消息ing"); if (sender == _id) {$("#chatting-history").append("<div class='me-msg'><span class='me-chat-icon'></span><div class='me-msg-container'>" + msg + "</div><div class='clear-both'></div></div>"); }else {$("#chatting-history").append("<div class='other-msg'><span class='other-chat-icon'></span><div class='other-msg-container'>" + msg + "</div><div class='clear-both'></div></div>"); }$("#chatting-history").scrollTop($("#chatting-history")[0].scrollHeight);})

JS方法整理

使?jié)L動(dòng)條一直顯示最底下:
$("#dom_id").scrollTop($("#dom_id")[0].scrollHeight);
在div內(nèi)部動(dòng)態(tài)添加一段代碼塊:
$("#dom_id").append("<div>………………</div>");

mongodb中populate的使用

使用的目的:實(shí)現(xiàn)在一個(gè) document 中填充其他 collection(s) 的 document(s)
在定義Schema
的時(shí)候奉呛,如果設(shè)置某個(gè) field 關(guān)聯(lián)另一個(gè)Schema
计螺,那么在獲取 document 的時(shí)候就可以使用 Population 功能通過(guò)關(guān)聯(lián)Schema
的 field 找到關(guān)聯(lián)的另一個(gè) document,并且用被關(guān)聯(lián) document 的內(nèi)容替換掉原來(lái)關(guān)聯(lián)字段(field)的內(nèi)容瞧壮。

文獻(xiàn)參考

require is not defined 超出獲取域

本意在chat.js中調(diào)取dbHelper.js中的函數(shù)登馒,用于查找用戶,但是獲取dbHelper失敗咆槽,轉(zhuǎn)換思路陈轿。
解決方法1:使用socket.emit與socket.on函數(shù),把dbHelper的調(diào)用轉(zhuǎn)移到www中去
嵌套層數(shù)太多...遂棄之
嘗試代碼:

//chat.js部分
$(".search-text").keypress(function (e) { //搜索框回車(chē)搜索好友
 if (e.which == 13) {
 doSearchFriend();
 }
 });
function doSearchFriend() {
 var keyword = $(\'.search-text\').val();
 var pattern = new RegExp(keyword, "i");
 var queryParams = {username: pattern};
 socket.emit(\'searchUser\',queryParams);
}

//www部分

socket.on(\'searchUser\',function (res,req,queryParams) {
 dbHelper.searchUser( queryParams ,function (err, data) {
 res.render(\'chat\', {entries: data});
 })
})


//dbHelper.js部分
exports.searchUser = function (queryParams, cb) {
 var userList = new Array();
 User.find(queryParams).exec(function (err,docs) {
 for(var i = 0; i < docs.length ; i++){
 userList.push(docs[i].toObject());
 }
 cb(true, userList);
 });
 cb(true, userList);
}

錯(cuò)誤原因總結(jié):res傳入不正確

解決方法2:使用promise的ajax封裝秦忿,再通過(guò)路由中的post路徑方法麦射,調(diào)用dbHelper
解決方法3:在搜索結(jié)果div中,顯示另一個(gè)網(wǎng)頁(yè)灯谣,使用iframe
解決方法4:給搜索操作綁定ajax潜秋,搜索即請(qǐng)求,在success函數(shù)中重寫(xiě)div.html()
解決方法5:綁定搜索事件胎许,load另一個(gè)頁(yè)面的一個(gè)div

Request 和 Response 對(duì)象

他們起到了服務(wù)器與客戶機(jī)之間的信息傳遞作用峻呛。
Request 對(duì)象用于接收客戶端瀏覽器提交的數(shù)據(jù)罗售,而 Response 對(duì)象的功能則是將服務(wù)器端的數(shù)據(jù)發(fā)送到客戶端瀏覽器。
Request 對(duì)象
從瀏覽器端取得數(shù)據(jù)的方法:
Request.QueryString 集合讀取表單 GET 方法數(shù)據(jù)
Request.Form 集合讀取表單 POST 方法數(shù)據(jù)
Request.ServerVariables 集合讀取服務(wù)器端環(huán)境變量

req.param獲取pathinfo中參數(shù) /api/users/{id}req.query獲取查詢參數(shù) /api/users?name=wwxreq.body獲取form提交參數(shù)

req與res的知識(shí)](http://i5ting.github.io/node-http/#10601))

jQuery 過(guò)渡效果

函數(shù)
$(selector).hide():隱藏被選元素
$(selector).show():顯示被選元素
$(selector).toggle():切換(在隱藏與顯示之間)被選元素
$(selector).slideDown():向下滑動(dòng)(顯示)被選元素
$(selector).slideUp():向上滑動(dòng)(隱藏)被選元素
$(selector).slideToggle():對(duì)被選元素切換向上滑動(dòng)和向下滑動(dòng)
$(selector).fadeIn():淡入被選元素
$(selector).fadeOut():淡出被選元素
$(selector).fadeTo():把被選元素淡出為給定的不透明度
$(selector).animate():對(duì)被選元素執(zhí)行自定義動(dòng)畫(huà)

a標(biāo)簽添加點(diǎn)擊事件但是不發(fā)生頁(yè)面跳轉(zhuǎn)和刷新

href="javascritp:void(0);"

**獲取$(this)子節(jié)點(diǎn)對(duì)象的方法:find(element) **

      $("#desktop a ").each(function(index){
         var imgurl=$(this).find('img').attr('src');
         alert(imgurl);
        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杀饵,一起剝皮案震驚了整個(gè)濱河市莽囤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌切距,老刑警劉巖朽缎,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谜悟,居然都是意外死亡话肖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)葡幸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)最筒,“玉大人,你說(shuō)我怎么就攤上這事蔚叨〈仓” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵蔑水,是天一觀的道長(zhǎng)邢锯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)搀别,這世上最難降的妖魔是什么丹擎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮歇父,結(jié)果婚禮上蒂培,老公的妹妹穿的比我還像新娘。我一直安慰自己榜苫,他們只是感情好护戳,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著垂睬,像睡著了一般灸异。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羔飞,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音檐春,去河邊找鬼逻淌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疟暖,可吹牛的內(nèi)容都是我干的卡儒。 我是一名探鬼主播田柔,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼骨望!你這毒婦竟也來(lái)了硬爆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤擎鸠,失蹤者是張志新(化名)和其女友劉穎缀磕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體劣光,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袜蚕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绢涡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牲剃。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雄可,靈堂內(nèi)的尸體忽然破棺而出凿傅,到底是詐尸還是另有隱情,我是刑警寧澤数苫,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布聪舒,位于F島的核電站,受9級(jí)特大地震影響文判,放射性物質(zhì)發(fā)生泄漏过椎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一戏仓、第九天 我趴在偏房一處隱蔽的房頂上張望疚宇。 院中可真熱鬧,春花似錦赏殃、人聲如沸敷待。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榜揖。三九已至,卻和暖如春抗蠢,著一層夾襖步出監(jiān)牢的瞬間举哟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工迅矛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妨猩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓秽褒,卻偏偏與公主長(zhǎng)得像壶硅,于是被迫代替她去往敵國(guó)和親威兜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容