微信開發-技術文檔(2)10.16-10.23

使用shell腳本快速啟動mongodb

  1. 在根目錄下新建腳本并命名. eg.
touch mongodb.sh
  1. 使用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對象。

事件綁定

  1. click ,點擊觸發
  2. focus,聚焦觸發
  3. blur,失焦觸發
  4. 回車綁定

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();

發送消息原理

  1. 客戶端向服務器發送任意類型消息。
socket.send();
  1. 服務器接收消息數據,執行“message”對應的回調函數。
socket.on('message', function(){});

服務器將接收到的信息保存到數據庫中,并且把消息轉發到sender客戶端、receiver客戶端。

io.to(sender).emit('msg',sender, receiver, msg);io.to(receiver).emit('msg',sender, receiver, msg);
  1. 客戶端接收服務器端發來的消息,在前端頁面顯示消息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);
        }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容