使用shell腳本快速啟動mongodb
- 在根目錄下新建腳本并命名. eg.
touch mongodb.sh
- 使用vi編輯器在腳本中添加自定義的shell命令
vi mongodb.sh
在文件中添加mongodb啟動命令
mongod --dbpath /usr/local/Cellar/mongodb/3.2.7/data/db
保存退出,啟動shell腳本
./mongodb.sh
socket.io 原理理解總結
socket.io,是一個使用反向ajax方法處理數據的庫。獲取數據,模擬一個ajax請求向服務器發送數據。
為基于nodejs的web應用,創建一個本地服務器(專用于本個web應用):
Server端:
var express = require('express') , app = express() , server = require('http').createServer(app) , io = require('socket.io').listen(server); //監聽服務器,監聽通過該Server的連接信息,而非監聽sockets
在用戶端,為每一個(通過登錄驗證)登入聊天頁面的用戶、即意圖連接本地服務器的用戶,創建一個socket,分配唯一的socketID,所有用戶獨立的socket之間的通訊都建立在Server端的本地服務器中。
Client端:
var socket = io.connect('http://localhost'); //獲取socket對象,并且通過這個socket收發事件
//var socket = io.connect('網站地址或ip');
summary:
本地服務器:socket == 一對多的關系
socket:登入用戶 == 一對一的關系
服務器端:接受字符串"action"作為客戶端發起連接的事件,當連接成功后,調用帶有socket參數的回調函數,處理用戶的請求。
客戶端:發起連接到指定服務器,并且傳入當前socket對象。
事件綁定
- click ,點擊觸發
- focus,聚焦觸發
- blur,失焦觸發
- 回車綁定
Socket.IO內置的默認事件
服務器端事件:
- io.sockets.on('connection',function(socket) {})
:socket連接成功之后觸發,用于初始化 - socket.on('message',function(message, callback) {})
:客戶端通過socket.send
來傳送消息時觸發此事件,message為傳輸的消息,callback是收到消息后要執行的回調 - socket.on('anything',function(data) {})
:收到任何事件時觸發 - socket.on('disconnect',function() {})
:socket失去連接時觸發(包括關閉瀏覽器,主動斷開,掉線等任何斷開連接的情況)
客戶端事件:
connect:連接成功
connecting:正在連接
disconnect:斷開連接
connect_failed:連接失敗
error:錯誤發生,并且無法被其他事件類型所處理
message:同服務器端message事件
anything:同服務器端anything事件
reconnect_failed:重連失敗
reconnect:成功重連
reconnecting:正在重連
客戶端觸發順序:
第一次連接時,事件觸發順序為:connecting->connect;
當失去連接時,事件觸發順序為:disconnect->reconnecting(可能進行多次)->connecting->reconnect->connect。
Socket.io各個發送消息的含義
// 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');
// 進入一個房間
socket.join('room');
// 離開一個房間
socket.leave('room');
發送消息給指定客戶端方法
io.sockets.connected[socketid].emit();
io.to(socket.id).emit();
socket.emit();
發送消息原理
- 客戶端向服務器發送任意類型消息。
socket.send();
- 服務器接收消息數據,執行“message”對應的回調函數。
socket.on('message', function(){});
服務器將接收到的信息保存到數據庫中,并且把消息轉發到sender客戶端、receiver客戶端。
io.to(sender).emit('msg',sender, receiver, msg);io.to(receiver).emit('msg',sender, receiver, msg);
- 客戶端接收服務器端發來的消息,在前端頁面顯示消息div。
socket.on('msg', function (sender, receiver, msg) {// $("div").append("<div>動態創建div</div>") //動態創建代碼塊 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方法整理
使滾動條一直顯示最底下:
$("#dom_id").scrollTop($("#dom_id")[0].scrollHeight);
在div內部動態添加一段代碼塊:
$("#dom_id").append("<div>………………</div>");
mongodb中populate的使用
使用的目的:實現在一個 document 中填充其他 collection(s) 的 document(s)
在定義Schema
的時候,如果設置某個 field 關聯另一個Schema
,那么在獲取 document 的時候就可以使用 Population 功能通過關聯Schema
的 field 找到關聯的另一個 document,并且用被關聯 document 的內容替換掉原來關聯字段(field)的內容。
require is not defined 超出獲取域
本意在chat.js中調取dbHelper.js中的函數,用于查找用戶,但是獲取dbHelper失敗,轉換思路。
解決方法1:使用socket.emit與socket.on函數,把dbHelper的調用轉移到www中去
嵌套層數太多...遂棄之
嘗試代碼:
//chat.js部分
$(".search-text").keypress(function (e) { //搜索框回車搜索好友
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);
}
錯誤原因總結:res傳入不正確
解決方法2:使用promise的ajax封裝,再通過路由中的post路徑方法,調用dbHelper
解決方法3:在搜索結果div中,顯示另一個網頁,使用iframe
解決方法4:給搜索操作綁定ajax,搜索即請求,在success函數中重寫div.html()
解決方法5:綁定搜索事件,load另一個頁面的一個div
Request 和 Response 對象
他們起到了服務器與客戶機之間的信息傳遞作用。
Request 對象用于接收客戶端瀏覽器提交的數據,而 Response 對象的功能則是將服務器端的數據發送到客戶端瀏覽器。
Request 對象
從瀏覽器端取得數據的方法:
Request.QueryString 集合讀取表單 GET 方法數據
Request.Form 集合讀取表單 POST 方法數據
Request.ServerVariables 集合讀取服務器端環境變量
req.param獲取pathinfo中參數 /api/users/{id}req.query獲取查詢參數 /api/users?name=wwxreq.body獲取form提交參數
req與res的知識](http://i5ting.github.io/node-http/#10601))
jQuery 過渡效果
函數
$(selector).hide():隱藏被選元素
$(selector).show():顯示被選元素
$(selector).toggle():切換(在隱藏與顯示之間)被選元素
$(selector).slideDown():向下滑動(顯示)被選元素
$(selector).slideUp():向上滑動(隱藏)被選元素
$(selector).slideToggle():對被選元素切換向上滑動和向下滑動
$(selector).fadeIn():淡入被選元素
$(selector).fadeOut():淡出被選元素
$(selector).fadeTo():把被選元素淡出為給定的不透明度
$(selector).animate():對被選元素執行自定義動畫
a標簽添加點擊事件但是不發生頁面跳轉和刷新
href="javascritp:void(0);"
**獲取$(this)子節點對象的方法:find(element) **
$("#desktop a ").each(function(index){
var imgurl=$(this).find('img').attr('src');
alert(imgurl);
}