了不得的Node.js讀書筆記

原文摘自個人前端博客,歡迎你們來訪問前端

http://www.hacke2.cnjava

第二章 Js概覽

基於GoogleV8引擎

  • Object.keys(o)
  • 數組方法:遍歷forEach、過濾filter、改變map
  • 實現了String.prototype.trim()
  • 含有JSON解析

第三章 阻塞與非阻塞IO

單線程注意點

  • 當心處理內存中的變量,可能會影響兩次訪問的結果
  • 不要編寫阻塞式代碼,可能會影響第二次訪問的時間

事件輪訓

  • 先註冊事件
  • 不斷詢問這些事件是否已經分發dispatch
  • 當事件分發了,相應的回調就會被觸發
  • 若是事件未觸發,則繼續執行其餘代碼
  • 捕獲將來纔會執行到的函數所拋出的異常是不可能的
  • 避免同步IO

第四章 Nodez中的Javascript

global對象

  • 對應於瀏覽器window

process對象

  • process.nextTick == serTimeout(fn,1)

模塊

  • require module exports
  • NPM
  • 絕對模塊指Node內置模塊以及在node_modules模塊require(‘fs’)
  • 相對模塊指經過相對路徑找的模塊require(‘./module’)
  • 暴漏數據exports.a(多個)、重寫module.exports(一個)

##事件node

  • EventEmitter
  • 事件監聽 on,事件分發emit,事件移除removeListener
  • 只執行一次once
  • data事件 數據是部分到達,而不是一次性全到達返回給你

buffer

  • 處理二進制數據

第五章CLI &FS API

Stream

  • stdin 可讀流 stdout/stderr可寫流
  • stdin.resume 等待用戶輸入
  • console == process.stdout.write(str + ‘\n’)

fs

  • readdirSync(__dirname) readFileSync同步
  • readdir(‘.’, async) readFile 異步
  • createReadSteam 讀取可變大小 有data、end事件多用於圖片、大型文件等
  • watchFile監視文件是否改變

process

  • process.argv 運行的參數
  • process.cwd 獲取當前工做目錄
  • process.env 環境變量
  • process.exit退出
  • 信號量

第六章TCP

TCP

  • 面向鏈接,基於IP協議
  • IP協議發包無序,TCP給發送的IP包含了標示符和數據流順序信息
  • 面向字節 對字符以及字符編碼徹底無知,很好的靈活性
  • 可靠性 三次握手、窗口時間重發
  • 流控制,對接收和發送的速度控制
  • 擁堵控制 避免擁堵、數包報的延遲率和丟包率不會過高

Telnet

  • 當不是telnet協議是自動降級爲TCP
  • 發送GET /HTTP/1.1模擬瀏覽器請求,兩次回車

net

  • Node.js核心TCP模塊
  • data close end事件
  • conn.setEncoding(‘utf-8’) 或 Buffer.toString(‘utf-8’)
  • 服務端createServer 客戶端connect方法 connect事件

第七章HTTP

HTTP

  • TCP上層協議
  • Content-Type類型 文本、HTML、XML、JSON、PNG
  • Transfer-Encoding: chunked 輸出的內容長度不能肯定,Node天生的異步機制, 這樣相應能夠逐造成
  • 301 永久轉移 302 臨時轉移 304資源未改變 403未受權 404資源未找到
  • 表單Content-Type application/x-www-form-unencoded

http 模塊

  • request、response 參數
  • 判斷路由爲method+url
  • querystring模塊 將字符串解析成對象
  • request方法模擬一個請求,傳回來的數據2進制,設置utf-8
  • superagent 模擬客戶端(模擬一個請求)模塊
  • up 重啓服務器模塊

第八章Connect

工具集&中間件

  • 模塊:connect
  • 中間件調用server.user(...)
  • 日誌中間件console.log(‘%s %s ’, req.method, req.url)
  • 模擬請求時間過長中間件,在res.end是清除定時器
  • static中間件 處理靜態文件connect.static(‘..’)
  • query中間件 獲取查詢字符串connect.query
  • logger 中間件connect.logger(‘dev’)
  • body parser中間件connect.bodyParser()若是在POST使用了JSON格式,body parser自動轉JSON對象,還能夠處理用戶上傳文件req.body.file多文件表單name 使用name=」file[]」
  • seesion中間件 會話connect.session 使用方法req.session.user
  • redis session 會話持久化中間件
  • methodOverride 中間件 讓低版本瀏覽器支持PUT、DELETE、PATCH
  • basicAuth中間件 用戶身份驗證

第九章EXPRESS

express

  • WEB應用開發框架,基於Connect
  • app.set(‘view engine’, ‘ejs’) 設置EJS模板引擎
  • app.set(‘view’, __dirname + ‘/view’) 設置視圖層路徑
  • app.set(‘view cache’, ‘true) 設置模板緩存
  • 使用app.get()、app.put()、app.post()配置路由,可傳參數如:id,獲取req.params.id
  • res.render(‘search’,obj) 渲染模板
  • 其餘設置大小寫敏感、嚴格路由、jsonp回調
  • 爲res和req提供了快捷方法 render渲染、redirect重定向req.header檢查頭信息
  • 中間件 app.user(function(req, res, next){})
  • 代碼組織 分層、分包、MVC,建議仿照Spring MVC

模板引擎

Express/Haml/Jade/CoffeeKup/JQuery Templates for nodegit

#第十章WebSocketweb

Ajax

  • 異步javascripy
  • 缺陷;每次都創建HTTP請求,消耗網絡資源,不適於實時服務 HTML5 WebSocket
  • 基於ws協議
  • node支持:websocket.io
  • 客戶端new WebSocket

缺陷

  • 關閉不意味着斷開,使用心跳檢測機制判斷
  • 對JSON支持不夠友好
  • 客戶端臨時斷開沒法解決 使用定時器或者刷新頁面?
  • 兼容性

第十一章Socket.io

優點

  • 跨瀏覽器,支持WebSocket則原生,不支持使用長鏈接方式,鏈接會持續打開 20-50s
  • 即便瀏覽器支持的WebSocket被代理或者防火牆禁止了,Socket.io仍然會經過其 他技術來解決
  • 若是客戶端中止傳輸信息,而且必定時間沒有正常的關閉,則認爲鏈接已經斷開
  • 當鏈接丟失時,自動重連
  • 對邏輯進行分層,有命名空間
  • 支持emit分發和listen監聽事件

第十二章MongoDB

MongoDB

  • 面向文檔,絕大多數狀況是JSON
  • 鏈接 new mongodb.Server(‘127.0.0.1’, 27017)
  • API open insert find ensureIndex findOne
  • $set 設置 $push 推入數組

Mongoose

  • 相似於JAVA中ORM框架,簡化數據庫開發
  • 鏈接mongoose.connect(‘mongodb://localhost/database’)
  • Schema:一種以文件形式存儲的數據庫模型骨架,不具有數據庫的操做能力
  • Model: 由Schema發佈生成的模型,具備抽象屬性和行爲的數據庫操做對
  • Entity:由Model建立的實體,他的操做也會影響數據庫
  • index 索引 title : {type : String, index : true} unique : true 惟一
  • new Schema({}).pre(‘save’, function(){})保存以前作一些處理
  • 經常使用API find,findOne,remove,update,count
  • new Schema({}).find({_id:‘xx’}).where(‘title’,‘xxx’).sort(‘content’, -1).limit(5).run(function(err, data){}) 相似JQ查詢
  • .select(‘_id’, ‘name’)選擇查詢指定字段
  • .skip 跳過 mongoose.Schema.ObjectId 生成隨機ID
  • clazz : [Clazz] 嵌套的Sehema
  • clazz: {type : ObjectId , ref: ‘Clazz’} 關聯查詢
  • 添加靜態PersonSchema.statics.findByName經過model調用
  • 添加實例方法 PersonSchema.methods.findSimilarTypes Entity調用

第十三章MySQL

MySQL

  • 主要使用query執行SQL
  • 有佔位符 ? 插入數據(和JAVA同樣)
  • 使用seqelize Node版ORM框架

第十四章Redis

Redis

  • 應用場景:簡單數據模型、數據集。適合存儲在內存
  • seesion持久化

第十五章 代碼共享

書寫兼容性代碼

  • 導出模塊 ,前端後端均可使用

(function(module){
module.exports = function(a, b ){ 
return a+b;
}
If(‘undefined’ != typeof window) {
Window.add = module.exports;
}
})(‘undefined’ == typeof module ? {module : {exports : {}}}: module)redis

  • 模擬實現ECMA:擴展原型或者實現工具函數
  • EventEmitter。Assert、XMLHttpRequest、DOM、WebSocket、node-canvas都在 git上有實現
  • bowserbuild 將node模塊轉爲瀏覽器可識別的代碼

第十六章測試

assert

  • 經常使用API ok,be/equal/eql/a/macth...

Mocha

    • 簡化書寫
    • 測試異步代碼
    • 生成報告
相關文章
相關標籤/搜索