var htttp = require('http') 加載http模塊var server = http.createServer(function(req,res){ 建立一個服務器 req請求 res響應 req.url 請求地址 res.write() 給瀏覽器端輸出 res.end() 結束})server.listen(8080) 監聽path 工具函數 1 path.join([path1][, path2][, ...]) 用於鏈接路徑。 2 path.resolve([from ...], to) 將 to 參數解析爲絕對路徑。 3 path.resolve(from, to) 用於將相對路徑轉爲絕對路徑。 4 path.parse(pathString) 返回路徑字符串的對象。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。文件操做:fs -----file system 文件系統的縮寫var fs = require('fs') 加載fs模塊fs.readFile(文件名,回調函數) 讀文件/異步操做 回調函數有兩參數 err data/讀到的數據fs.writeFile(文件名,要寫的內容,回調函數) 寫文件 回調函數有一個參數 errfs.rename('原來文件名','如今名字',function(err){})。。。。。。。。。。。。案例練習。。。。。。。。。。。。。。。。var http = require('http')var fs = require('fs')var server = http.createServer(function(req,res){ var fileName = './www'+req.url; //根目錄下面有個www文件夾 fs.readFile(fileName,function(err,data){ if(err){ res.write('404') }else{ res.write(data) } res.end() })})server.listen(8080)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。數據請求get請求 req.json({key:value}) 給前端發送數據,前端經過ajax請求獲得數據 req.url //get數據存在url上 querystring 模塊 把username=blue&age=18轉換成json{username:blue,age:18} querystring.parse('username=blue&age=18')-> {username:blue,age:18} querystring.stringify 跟querystring.parse做用反過來 url模塊 專門用來解析地址的 把http://baidu.com?username=blue&age=18解析 var obj = url.parse('http://baidu.com?username=blue&age=18',true) => obj.pathname-> http://baidu.com obj.query-> {username:blue,age:18}post請求 數據分段發送 var str='' req.on('data',function(data){ data有一段數據到達就會觸發一次 str+=data }) req.on('end',function(){ end數據所有到達觸發一次 console.log(str) 這裏str已是完整數據 })var server = http.createServer(function(req,res){ 建立一個服務器 req請求 res響應 req //來接受前臺傳過來的數據}) 第二種方法經過中間件body-parser app.use(bodyParser.urlencoded({extended:false})).......................................................................................http:協議 協議流程 1 http客戶端發起請求,建立端口 2 http服務器在端口監聽客戶端請求 3 http服務器想客服端返回狀態和內容瀏覽器後計算機 訪問一個 地址的大概操做步驟1. 瀏覽器(如Chrome)搜索自身的DNS 緩存2. 搜索操做系統自身的DNS緩存(瀏覽器沒有找到緩存或緩存已經失效)3. 讀取本地的 HOST 文件4. 瀏覽器 發起一個DNS 的 一個系統調用5. 瀏覽器得到域名對應的 IP 地址後,發起 HTTP 的「三次握手🤝」6. TCP/IP 鏈接創建起來後,瀏覽器就能夠向服務器發送 HTTP 請求了,例如使用 HTTP 的 GET 方法請求一個根域裏的一個域名,協議能夠採用 HTTP 1.0 的一個協議。7. 服務器端接收到了這個請求,根據路徑參數,競購後端的一些處理後,把處理的一個結果的數據返回給瀏覽器,若是是 目標網 的頁面就會把完整的 HTML 頁面代碼返回給瀏覽器。8. 瀏覽器拿到了 目標網 的完整的HTML 頁面代碼,在解析和渲染這個頁面的時候,裏面的 JS 、CSS、 圖片靜態資源,他們一樣也是一個個 HTTP 請求,都須要上面的主要七個步驟9. 瀏覽器根據拿到的資源對頁面進行渲染,最終把一個完整的頁面呈現給用戶.......................................................................................EventsEmittervar EventsEmitter = require('events').EventsEmittervar life = new EventsEmitter()life.on('事件名',對應函數) //監聽最多爲10個life.emit('事件名')######################################################################################模塊化 系統模塊 Crypto加密 Events事件 Net網絡操做 OS操做系統信息 Path處理文件路徑 stream流操做 自定義模塊 require 引入模塊 通常是引入系統模塊 只要require('http') 有'./'從當前目錄找,沒有'./' 從系統模塊或者node_nodules文件夾找 module 模塊輸出批量 //module.exports ===exports module.exports={} exports 單個輸出 exports.a=12 向外輸出一個變量a 包管理器 npm install下載 publish上傳包 unpublish刪除包、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、express框架 保留了原生的功能,添加了一些方法 const express = require('express') 模塊引入 const server = express() server.use('地址',function(req,res){ 添加一個響應或者說處理請求 // res.send('123') res.redirect('地址') 重定向 地址是跟着根目錄走的 res.end() }) server.listen(8080) 。。。。。。。。。。。。。。。。。。。。。。。。。。。 server.get('/',function(req,res){}) 只接受get請求 server.post('/',function(req,res){}) 只接受post請求 server.use('/',function(req,res){}) 不管是get 仍是post 最後都會走到use express 中間件或者插件 1.express-static 處理靜態文件 使用法法 server.use(expressStatic('./www')) 2.body-parser server.get('/',function(req,res){ req.query //get方式傳遞過來的數據,無需中間件支持 req.body //post方式傳遞過來的數據,需body-parser支持 用以前需 server.use(bodyParser.urlencoded{extended/擴展模式:false,limit/大小限制:2*1024}) }) ********************************************* express的鏈式操做 server.use('/',function(req,res,next){ console.log('a') next() //必需要有next纔會執行下面代碼 }) server.use('/',function(req,res,next){ console.log('b') })、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、cookie ,session cookie 在*********瀏覽器保存一些數據**********,每次向服務器發送請求都會帶過來,只有4k,不安全 session 保存數據,****保存在服務器端****,存儲大,安全 session 基於cookie實現的,cookie中會有session的id,服務器就是利用sessionid找到session文件,讀取,寫入 隱患:session劫持 在/aaa/bbb 路徑下設置了一個cookie 那麼在/aaa和/目錄下均可以訪問這個cookie 反之不行 cookie 1,讀取 --基於cookie-parser來讀起cookie 用法 server.use(cookieParser('密鑰'))//在req上加個cookies和signedCookies,加了密鑰就能夠把有密鑰的cokie解析 server.use('/aaa/html',function(req,res){ req.signedCookies //讀取加密鑰的cookie req.cookies //讀取沒有加密鑰的cookie res.cookie('user','cy',{path(在aaa路徑下才能訪問這條cookie):'/aaa',maxAge(cookie過時時間):30*24*3600*1000,signed(簽名密鑰):true}) //發送設置一個cookie res.clearCookie(刪除cookie名字) 刪除cookie }) session 利用cookie-session中間件 用法server.use(cookieSession({keys:[]//必須加密鑰數組,maxAge:過時時間,以毫秒爲單位})) 用session必須先server.use(cookieParser()) 而後在server.use(cookieSession({})) //在req加session 設置req.session['key']=value 解析好的session在req.session 刪除delete req.session&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&模板引擎---------jade-ejs-swig jade 侵入式 jade.renderFile('文件',{pretty(格式美化):true}) 使用方法 html //縮進表明子元素 body div 屬性格式----屬性放()裏面,逗號隔開 script(src='a.js') ==><script src='a.js'></script> style有兩種寫法 1.style={width:'100px'} 2.style='width:100px' class有兩種寫法 2.class=[clasa,clasb] 2.class='clasa clasb' 內容格式 1.空一個格直接日後寫 p 內容==><P>內容</p> | 表明|後面的內容原樣輸出 . 表明子(裏面)的東西都原樣輸出 div. - 表明後面是一段js代碼 div!表明不須要轉義輸出html include 引入外部文件 #{變量名} 表明變量 特殊 style=變量,class=變量 不須要加#{} span #{a} 等價於 span=a 都輸出<span> 變量a</span> ------------------------------------------------------------------------------------- ejs 非侵入式 ejs.renderFile('文件',{數據},function(err){}) 頁面中用變量 <%= 變量名 %> =轉義輸出 -不轉義輸出 <% for(){ %> <% } %> <% include %> 引入。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。body-parser 只能解析上傳數據不能解析上傳的文件設置 <form enctype='multipart/form-data'> <input type='file' > </form>multer 能夠解析數據跟上傳文件如圖片 var multer =require('multer') var obgMulter =multer({dest(存儲路徑):'路徑'}) 用法server.use(obgMulter.any()) 在req上加了一個files 上傳上的文件 req.files=[{文件各類屬性}]multer解析完上傳文件後,會被保存爲一個包含如下字段的對象 req.files=[{文件各類屬性}]: fieldname - 表單提交的文件名(input控件的name屬性) originalname - 文件在用戶設備中的原始名稱 encoding - 文件的編碼類型 mimetype - 文件的Mime類型 size - 文件的大小 destination - 文件的保存目錄(DiskStorage) filename - 文件在destination中的名稱(DiskStorage) path - 上傳文件的全路徑(DiskStorage) buffer - 文件對象的Buffer(MemoryStorage)..............................................path 模塊 var path =require('path') var src='c:\\wamp\\www\\a.html' var obj =path.parse(str) obj={ base:文件名部分包括擴展名, ext: 擴展名, dir: 路徑 name:文件名不包括擴展名 } path.resolve(_dirname,'/public') 把相對路徑轉換成絕對路徑。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 consolidate --適配,整合模板引擎到express裏面 配置模板引擎三步 2 用哪一種模板引擎 2模板文件放哪兒 1輸出什麼東西 var consolidate = require('consolidate') server.set() 對整個server的全局配置 server.set('view engine','html') //輸出什麼東西 server.set('views','./views') //模板文件在哪兒 server.engine('html',consolidate.ejs) //用哪一種模板引擎######################################################################################router-路由 把不一樣的目錄對應到不一樣的模塊 var userRouter = express.Router() //迷你server server.use('/user',userRouter) //掛載在server下面 userRouter.get('/1.html',function(req,res){}) //客戶訪問/user/1.html。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。數據庫 數據庫裏面不能儲存名文密碼 加密以後才存 MD5簽名算法 MD5給密碼簽名加密 const crypto = require('crypto') var obj = crypto.createHash('md5') var 後綴 =‘一串隨機符號’ obj.update('加密的東西'+後綴) str = obj.digest('hex') 獲取16進制的結果 MySQL: server端 client端 數據基本概念 兩種單位 1庫:文件夾/用來管理表,自己無法存數據 2表:文件-存儲數據的 行:一條數據 列:數據庫裏面不叫列,叫字段,表明一項數據 主鍵:惟一的標識符,性能更高 node中的mysql模塊 是客戶端 兩部 1連接服務端2查詢 var mysql = require('mysql') mysql.createConnection(哪臺服務器,用戶名,密碼,操做哪一個庫) //連接服務端 mysql.createPool(哪臺服務器,用戶名,密碼,操做哪一個庫) 連接池 var db =mysql.createConnection({host:'localhost',user:'root',password:'123456',database(數據庫名):'2016222',port:'3036'}) db.query(幹啥,回調函數) //查詢 db.query('SQL語句',function(err,data){}) SQL:結構化查詢語句 SQL標準寫法 1:關鍵字大寫 2庫表字段寫反引號 4大查詢語句--增刪改查 增 INSERT insert into 表 (字段列表) values(值列表) 如 INSERT INTO `user_table` (`ID`,`username`,`password`) VALUES (0,'chengyuan','123456') 刪 DELETE delete from 表 where 條件 改 UPDATE update 表 set 字段=值,字段=值 where 條件 查 SELECT select 什麼 from 表 where 條件 如 SELECT * FROM `user_table` select * from user limit 0,5 從匹配到的數據裏面從0條開始 選擇5條 WHERR age>=18 AND score>100 WHERR age>=18 OR score>100 ORDER 排序 ORDER BY age ASC升/DESC降 多條件排序 ORDER BY price ASC, sales DESC GROUP BY 聚類-合併相同的,相同的數據只保留一條,通常配合COUNT(計數)MIN(最小),MAX(最大),AVG(平均值),SUM(總和)一塊兒使用 COUNT() 計數 求每一個班的平均分 SELECT class,AVG(score) FROM stundent_table GROUP BY class 求每一個班的最高最低分 SELECT class,MIN(score),MAX(score) FROM stundent_table GROUP BY class class min-score max-score 獲得數據是 1 30 100 2 40 99 LIMIT --限制輸出 LIMIT 10 前10條 LIMIT 5,8 從第五條開始 要八個 route //至關於小型express 把一個大項目拆分紅許多小模塊 var route = require('express-route') ////////////////////res.json() 給前端傳json數據當路由地址是 'user/:id' user/100 => req.params.id獲取到100cheerio 能夠理解成一個 Node.js 版的 jquery,對語法不明白的先去學下jquery。redis