<html> <head> <meta charset="utf-8"> <title>文檔筆記----nodejs菜鳥教程</title> <meta name="keyword" content="文檔筆記----nodejs菜鳥教程"> <meta name="discription" content="文檔筆記----nodejs菜鳥教程"> </head> <body> <script> 文檔筆記-- --nodejs菜鳥教程 第一章 建立第一個應用 若是咱們使用PHP來編寫後端代碼是時, 須要Apache或者Nginx服務器, 而且配上mod_php5模塊和php_cgi. 使用nodejs時, 咱們不只僅在實現一個應用, 同時還實現了整個HTTP服務器.事實上, 咱們的Web應用以及對應的web服務器基本是同樣的 1 引入require模塊: 用來載入node.js模塊 var http = require("http"); 2 建立服務器: 服務器能夠監聽客戶端的需求, 相似Apache / Nginx等HTTP服務器 3 接受請求與響應請求 拂去其端可使用瀏覽器或者終端發送HTTP請求, 服務器接受請求後返回相應數據. http.createServer(function(request, response) { //內容類型 response.writeHead(200, { "Content-Type": "text/plain" }); //發送響應式請求 response.end("Hello World\n"); }).listen(8888); 第二章 NPM使用 NPM是隨同Nodejs一塊兒安裝的包管理工具, 能解決Nodejs代碼部署上的不少問題, 常見的使用場景有如下幾種: 1 容許用戶從NPM服務器下載被別人編寫的三方包到本地使用 2 容許用戶從NPM服務器下載並安裝別人編寫的命令程序到本地使用 3 容許用戶將本身編寫的包或者命令程序上傳到NPM服務器供別人使用 查看版本 npm - v 全局安裝npm npm install npm - g 安裝express到本地 npm install express 卸載express npm uninstall express 查看安裝路徑 npm ls 更新express模塊 npm update express 建立模塊 npm init 第三章 Node.js REPL(交互式解釋器) Node自帶交互式解釋器, 能夠至此那個一下任務: 1 讀取 - 讀取用戶輸入, 解析輸入的javascript數據結構而且存儲在內存中 2 執行 - 執行輸入的數據結構 3 打印 - 輸出結構 4 循環 - 循環操做以上步驟直到用戶量詞按下ctrl + c按鈕退出 下劃線(_) 變量 -- > 獲取表達式運算結果 ctrl + c 退出當前終端 ctrl + c按兩次 退出Node REPL ctrl + d退出Node REPL 向上 / 向下方向鍵 - 查看歷史命令 tab鍵 列出當前命令 help 列出使用命令 clear 退出多行表達式 save filename 保存當前的Node REPL 會話到指定文件 load filename 載入當前Node REPL會話的文件內容 第四章 Node.js 回調函數 Node.js異步編程的直接提現說就是回調函數 異步編程依託於回調函數, 但不能說使用了回調函數就能是異步編程 阻塞代碼實例: var fs = require("file"); var data = fs.readFileSync("input.txt"); console.log(data.toString()); console.log("程序執行結束"); 非阻塞代碼實例: var fs = require("file"); fs.readFile("input.txt", function(err, data) { if (err) { return console.error(err); } else { console.log(data.toStrign()); } }) console.log("程序執行結束"); 第五章 Node.js EventEmitter Node.js全部的異步I / O操做在完成是都會發送到事件隊列 events只提供了events.EventEmitter 這一個對象 核心就是事件觸發與事件監聽功能的封裝 //引入events模塊 var events = require("event"); //建立eventsEmitter對象 var eventEmitter = new events.EventEmitter(); //綁定事件 event.on("some_event", function() { console.log("some_event觸發"); }) //觸發事件 event.emit("some_event"); 第六章 Buffer(緩衝區) javascript語言自身只有字符串數據類型, 沒用二進制數據類型 但在處理像TCP流或者文件流時, 必須使用到二進制數據.所以在Node.js中, 定義了一個Buffer類, 該類用來建立一個專門存放二進制數據的緩存區 一個Buffer相似一個整數數組, 但他對應於V8堆內存以外的一塊原始內容 var buf = new Buffer(10) //按長度建立 var buf = new Buffer([10, 20, 30, 40, 50]) //按給定的數組建立 var buf = new Buffer("www.runob.com", "utf-8"); //經過一個字符串建立 寫入緩衝區 buf.write() //返回字節數 從緩衝區讀數據 buf.toString() //返回數據字符串 轉爲JSON對象 buf.toJSON(); 合併緩衝區 buffer.concat(buf1, buf2, ..); // 緩衝區比較 buf1.compare(buf2); // 緩衝區裁剪 buf.slice(); 緩衝區長度 buf.length 第七章 Node.js Stream(流) Stram是一個抽象接口, Node中有不少對象實現了這個接口.例如, 對http服務器發起的request對象就是一個Stream, 還有stdout(標準輸出) 分類: 1 readable 可讀操做 2 writable 可寫操做 3 duplex 可讀可寫操做 4 transform 操做別寫入數據, 而後讀出結果 全部的Stream對象都是EventEmitter對象 data: 當有數據可讀時觸發 end: 沒有更多的數據可讀時觸發 error: 在接收和寫入過程當中發生錯誤時觸發 finish: 全部數據已被寫入到底層系統時觸發 從流中讀取數據 var fs = require("file"); var data = ''; //建立可讀流 var readerStream = fs.createReadStream("input.txt"); //設置編碼 readerStream.setEncoding("UTF8"); //處理流事件 readerStream.on("data", function(chunk) { data += chunk; }) readerStream.on("end"function() { console.log(data); }) readerStream.on("error", function(err) { console.log(err.stack); }) console.log("程序執行完畢"); 寫入流 var fs = require("file"); var data = "324324324"; var writerStream = fs.createWriteStream("output.txt"); writerStream.write(data, "UTF8"); writerStream.end(); writerStream.on("finish", function() { console.log("寫入完成"); }) writerStream.on("error", function(err) { console.log(err.stack); }) console.log("程序執行完畢"); 第八章 Node.js函數 匿名函數: 咱們能夠把一個函數做爲變量傳遞.可是咱們不必定要繞這個 "先定義,再傳遞" 的圈子, 咱們能夠直接在另外一個函數的括號中定義和傳遞這個函數 execute(function(word) { console.log(word); }) 第九章 Node.js模塊系統 爲了讓Node.js的文件能夠相互調用, Node.js提供了一個簡單的模塊系統. 模塊是Node.js應用程序的基本組成部分, 文件和模塊是一一對應的.換言之, 一個Node.js文件就是一個模塊 //func.js experts.func = function() { } module.experts = function() { } var f = require("func"); //引入的時候前者 f.func();後者 f(); 模塊加載優先級 開始require - > 是否在文件模塊緩存區中 - > 否 - > 是否原生模塊 - > 否 - > 查找文件模塊 - > 根據擴展名載入文件模塊 - > 返回experts 是 - > 返回experts - > 是 - > 是否在原生模塊緩存區中 - > 否 - > 加載原生模塊 - > 緩存原生模塊 - > 返回experts 第十章 GET / POST GET: var url = require("url"); POST: var querystring = require("querystring"); 第十二章 Node.js經常使用工具 util是一個Node.js核心模塊, 提供經常使用函數的集合, 用於彌補核心javascript的功能過於精簡的不足 util.inherits() 是一個實現對象間原型繼承的函數. var util = require("util"); function Base() { } Base.prototype.showName = function() { } util.inherits(Sub, Base); var sub = new Sub(); //Sub僅僅繼承了Base在原型中定義的函數,而構造函數內部的屬性和函數都咩有被Sub繼承 util.inspect(); //將任意對象轉爲字符串的方法 util.isArray() //判斷傳入對象是否爲數組 util.isRegExp() //判斷傳入參數是否爲正則 util.isDate() //判斷傳入參數是否爲日期 util.isError(); //判斷是否爲一個錯誤的對象 第十三章 Node.js工具模塊 OS模塊 Path模塊 Net模塊 DNS模塊 Domain模塊 第十四章 Node.js路由 路由能夠經過請求的URL路徑來區別不一樣請求, 這是經過路由講請求以url路徑爲基準映射處處理程序上 第十五章 Node.js全局對象 javacript中有一個特殊的對象, 它及其全部屬性均可以在程序的任何地方訪問 最外層定義的變量 全局隨想的屬性 隱式定義的變量 __filename __dirname setTimeout(); clearTimeout(); serInterval(); clearInterval(); console process //用於描述當前Node.js進程狀態對象,提供了一個與操做系統的簡單接口 第十六章 Node.js文件系統 //異步讀取文件 readFile(); //異步 //同步讀取文件 readFileSync(); //同步 建議使用異步, 比起同步, 異步方法性能更高, 並且沒有阻塞 var fs = require("fs"); fs.readFile("input.txt", function(err, data) { if (err) { console.error(err.stack); } else { console.log(data.toString()); } }) var data = fs.readFileSync("input.txt"); console.log(data.toString()); fs.open("input.txt", function(err, fd) { }) fs.read(fd, buf, 0, buf.length, 0, function(err, bytes) { }) stats //異步寫入文件 fs.writeFile("input.txt", "xiruneirong", function(err) { }) //關閉文件 fs.close(); //截取文件 fsftruncate(fd, 10, function(err) { }) //刪除文件 fs.unlink("input.txt", function(err) { }) //建立目錄 fs.mkdir("dir", function(err) { }) //讀取目錄 fs.readdir(dir, function(err, files) { if (err) { return console.error(err); } files.forEach(function(file) { console.log(file); }) }) //刪除目錄 fs.rmdir(dir, function() { }) 第十七章 Nodejs Express 框架 快速打算建一個完整的網站 Express框架核心特色: 1 能夠設置中間件來響應http請求 2 定義了路由變用於執行不一樣的HTTP請求 3 能夠經過向模板傳遞參數來動態渲染HTML頁面 var express = require("express"); var app = express(); app.get("/", function(req, res) { res.send(); }) app.post('/', function(req, res) { console.log("主頁 POST 請求"); res.send('Hello POST'); }) // /del_user 頁面響應 var server app.listen(8888, function() { }) Request 對象 - request 對象表示 HTTP 請求, 包含了請求查詢字符串, 參數, 內容, HTTP 頭部等屬性。 常見屬性有: req.app: //當callback爲外部文件時, 用req.app訪問express的實例 req.baseUrl: 獲取路由當前安裝的URL路徑 req.body / req.cookies: 得到「 請求主體」 / Cookies req.fresh / req.stale: 判斷請求是否還「 新鮮」 req.hostname / req.ip: 獲取主機名和IP地址 req.originalUrl: 獲取原始請求URL req.params: 獲取路由的parameters req.path: 獲取請求路徑 req.protocol: 獲取協議類型 req.query: 獲取URL的查詢參數串 req.route: 獲取當前匹配的路由 req.subdomains: 獲取子域名 req.accepts(): 檢查可接受的請求的文檔類型 req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages: 返回指定字符集的第一個可接受字符編碼 req.get(): 獲取指定的HTTP請求頭 req.is(): 判斷請求頭Content - Type的MIME類型 Response 對象 - response 對象表示 HTTP 響應, 即在接收到請求時向客戶端發送的 HTTP 響應數據。 常見屬性有: res.app: 同req.app同樣 res.append(): 追加指定HTTP頭 res.set() 在res.append() 後將重置以前設置的頭 res.cookie(name, value[,option]): 設置Cookie opition: domain / expires / httpOnly / maxAge / path / secure / signed res.clearCookie(): 清除Cookie res.download(): 傳送指定路徑的文件 res.get(): 返回指定的HTTP頭 res.json(): 傳送JSON響應 res.jsonp(): 傳送JSONP響應 res.location(): 只設置響應的Location HTTP頭, 不設置狀態碼或者close response res.redirect(): 設置響應的Location HTTP頭, 而且設置狀態碼302 res.send(): 傳送HTTP響應 res.sendFile(path[,options][,fn]): 傳送指定路徑的文件 - 會自動根據文件extension設定Content - Type res.set(): 設置HTTP頭, 傳入object能夠一次設置多個頭 res.status(): 設置HTTP狀態碼 res.type(): 設置Content - Type的MIME類型 第十八章 RESFUL API 表述性狀態傳遞 第十二章 多進程 nodejs是單線程的模式運行, 事件驅動處理併發, 這樣有助於咱們在多核cpu的系統上建立多個子進程, 從而提升性能 const fs = require("fs"); const child_process = require("child_process"); for (var i = 0; i < 3; i++) { var worker_process = child_process.fork("support.js".[i]); worker_process.on("close", function(code) { }) 第二十一章 mysql var mysql = require("mysql"); var connection = mysql.createConnection({ host: "127.0.0.1", user: "root", password: "", database: "test" }) connection.query("select....", function(err, res, fields) { }) } 第二十二章 MongoDB var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://127.0.0:27017/test'; var insertData = function(db, callback) { //鏈接到表 site var collection = db.collection('site'); //插入數據 var data = [{ "name": "1221", "url": "www.hao123.com" }, { "name": "32132", "url": "c.baidu.com" } ]; collection.insert(data, function(err, result) { if (err) { console.log('Error:' + err); return; } callback(result); }); } MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("鏈接成功!"); insertData(db, function(result) { console.log(result); db.close(); }); }); </script> </body> </html>