使用shell腳本快速啟動(dòng)mongodb
- 在根目錄下新建腳本并命名. eg.
touch mongodb.sh
- 使用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ì)象。
事件綁定
- click 窘问,點(diǎn)擊觸發(fā)
- focus辆童,聚焦觸發(fā)
- blur,失焦觸發(fā)
- 回車(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ā)送消息原理
- 客戶端向服務(wù)器發(fā)送任意類型消息凯旭。
socket.send();
- 服務(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);
- 客戶端接收服務(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)容瞧壮。
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);
}