node.js學習html
1.node.js --------服務器前端
2.node.js不會獨立開發node
用途:jquery
1.中間層webpack
安全性git
性能github
下降主服務器的複雜度web
2.小型服務器mongodb
3.工具數據庫
node.js 優點
1.便於前端入手
2.性能高
3.利於和前端代碼整合
nodejs引入包
const multer = require( ' multer' );
node.js裏面的兩個核心包是 http 和 fs
關於錯誤處理:
錯誤處理:同步: try catch 異步:錯誤的回調優先
npm安裝包前使用 npm init初始化
$ npm init Package name: (hello) //模塊名字,npm init會自動取當前目錄名做爲默認名字,這裏不須要改,直接確認便可 Description: A example for write a module //模塊說明 Package version: (0.0.0) 0.0.1 //模塊版本號,這個你們按本身習慣來定就能夠 Project homepage: (none) //模塊的主頁,若是有的話能夠填在這裏,也能夠不填 Project git repository: (none) //模塊的git倉庫,選填。npm的用戶通常都使用github作爲本身的git倉庫 Author name: Elmer Zhang //模塊做者名字 Author email: (none) freeboy6716@gmail.com //模塊做者郵箱 Author url: (none) http://www.elmerzhang.com //模塊做者URL Main module/entry point: (none) hello.js //模塊的入口文件,咱們這裏是hello.js </span><span style="color:#ff6666;">(這個必填)</span><span style="color:#333333;"> Test command: (none) //測試腳本,選填 What versions of node does it run on? (~v0.5.7) * //依賴的node版本號,咱們這個腳本能夠運行在任何版本的node上,所以填 * About to write to /home/elmer/hello/package.json // 如下是生成的package.json文件內容預覽 { "author": "Elmer Zhang <freeboy6716@gmail.com> (http://www.elmerzhang.com)", "name": "hello", "description": "A example for write a module", "version": "0.0.1", "repository": { "url": "" }, "main": "hello.js", "engines": { "node": "*" }, "dependencies": {}, "devDependencies": {} } Is this ok? (yes) //對以上內容確認無誤後,就能夠直接回車確認了
關於npm的全局安裝和局部安裝
全局安裝:
全局安裝每每是安裝一個工具,他不是安裝在一個文件夾下,而是安裝在某個全局環境下(好比 babel webpack)
全局安裝了的babel和webpack,能夠看到在根目錄下都有cmd後綴的文件,經過這些文件,咱們就能夠直接在命令行中使用了。
如使用 babel --version、 babel-doctor --version等等都是有效的,且無論你是在哪一個目錄文件下運行的。
局部安裝:
局部安裝並非這樣,每每是在一個項目中安裝以後裝入 ./node_nodules 下面, 而後在項目中,咱們可使用 require 等方式引入。
這樣的侷限在於,只能是在本項目中使用,而webpack和babel這樣的工具能夠在各類狀況、各類項目中使用。
安裝npm 包的快捷鍵
1.模塊安裝
【npm install xxx】利用 npm 安裝xxx模塊到當前命令行所在目錄;
【npm install -g xxx】利用npm安裝全局模塊xxx;
2.本地安裝
【npm install xxx】安裝但不寫入package.json;
【npm install xxx --save】 安裝並寫入package.json的"dependencies"中; 【npm install xxx --s】
【npm install xxx --save-dev】安裝並寫入package.json的"devDependencies"中。【npm install xxx -d】
3.模塊刪除
【npm uninstall xxx】刪除xxx模塊;
【npm uninstall -g xxx】刪除全局模塊xxx;
模塊引用
從當前的modules文件夾開始往上查找
####爬蟲小案例: (可使用crawler模塊)
1.獲取目標網站 http.get
2.分析網站內容 cheerio (模塊能夠將一組html字符串轉化成類dom 能夠用jquery選擇器的語法選取內容)
3.獲取有效信息 下載或者其餘操做
服務器:
1.響應請求
2.數據交互
3.數據庫
--------------------------------------------------------------------------------
數據交互
http介紹
http報文結構 (header : <= 32k ; body : <= 2g )
狀態碼:
1xx 信息
2xx 成功 (200)
3xx 重定向
4xx 請求錯誤 (404)
5xx 服務器錯誤
請求方式
GET 獲取
數據放在url裏傳輸(放在請求頭裏)
容量小
POST 發送數據
容量大
數據放在body裏面
-------------------------------------------------------------------------
接收瀏覽器的get請求
**能夠用 url 模塊
url.parse(req.url , true) =>{
......
pathname,query
}
GET => "/aaa/b?xx=xxx&xxx=xx"
**還能夠用 querystring 模塊來實現
querystring.parse( query ); // query是切割好的字符串
-------------------------------------------------------------------------
接收瀏覽器的post請求
接受瀏覽器的post數據-----body
分爲幾回接受
const http = require('http'); // 導入http庫 const querystring = require('querystring'); // 導入querystring庫 let server = http.createServer((req,res)=>{ let arr = []; req.on('data',buffer=>{ arr.push(buffer); }); req.on('end',()=>{ // 全部數據傳輸完畢後執行 let buffer=Buffer.concat(arr); //傳送結束後再拼接在一塊兒 let post = querystring.parse(buffer.toString()); // tostring是爲了便於咱們查看,實際開發不用 console.log(post); }); }); //服務器監聽(防止程序結束) server.listen(8080);
POST => "XX=XXXX&XXX=XX"
模塊系統:分爲 系統模塊 和 第三方模塊
node.js 模塊系統:
1.定義模塊
module exports require
2.系統包
1.assert --斷言
assert(條件,msg) //普通的判斷
assert.deepEqual(變量,預期值,msg) //至關於 ==
assert.deepstrictEqual(變量,預期值,msg) //至關於 ===
2.path ---網址
str = root / a / b / 1.txt
path.dirname(str ); //文件路徑名 root / a / b
path.extname( str); // 文件類型名 .TXT
path.basename( str); //文件名 abc.TXT
path.resolve( ); //轉化爲絕對路徑輸出
3.querystring --- 請求數據
parse() js=>字符串
stringify() 字符串 =》 js
4.url ---- 網址
url.parse( )能夠解url的內容
url.format( ) 能夠將對象轉成url對象
const url = require('url'); //將url字符串轉成對象 // let string = 'https:47.95.207.1:3000/fcj/recommend/hot/hehe?us=123&ps=567#nihao'; // let str = url.parse(string); // console.log(str); //將對象轉回字符串 let str = { protocol: 'https:', slashes: null, auth: null, host: null, port: null, hostname: null, hash: '#nihao', search: '?us=123&ps=567', query: 'us=123&ps=567', pathname: '47.95.207.1:3000/fcj/recommend/hot/hehe', path: '47.95.207.1:3000/fcj/recommend/hot/hehe?us=123&ps=567', href: 'https:47.95.207.1:3000/fcj/recommend/hot/hehe?us=123&ps=567#nihao' } let string = url.format(str); console.log(string);
5.net(***網絡通訊模塊***)
簡單介紹OSI參考模型
物理層 > 數據鏈路層 > 網絡層(IP)> 會話層 > 表現層 > 應用層(HTTP)
互聯網裏(5層協議)
物理層 > 數據鏈路層 > 網絡層(IP)> 應用層(HTTP)
net 在傳輸層
關於post請求的傳輸格式( 例:<分隔符>\r\n字段信息\r\n \r\n內容\r\n\r\n <分隔符>\r\n字段頭\r\n\r\n內容\r\n<分隔符>\r\n字段頭\r\n\r\n內容\r\n<分隔符> - -)
1.用分隔符來切分
[ null,
" \r\n字段信息\r\n\r\n內容\r\n",
" \r\n字段信息\r\n\r\n內容\r\n",
'- -', ]
2.將第0個與最後一個去掉
3.對每一項使用\r\n\r\n 切割獲得字段信息和內容
*fetch *jsonp * formdata **websocket**(自帶跨域)
----------------------------------------------------------------------------------------
fetch-----原生,xhr改良版
1.讀取
2.解析
-----------------------------------------------------------------------------------------
jsonp (安全性低,早期用於解決跨域問題)
1.原理
2.jquery
======================================================
webSocket:
1.性能高
2.雙向
socket.io
1,簡單、方便
2,兼容 IE5
3,自動數據解析
express模塊
###服務器相關
服務器:1,服務器是一臺電腦 2,服務器軟件(apach tomcat iis ngnix node) 3.服務器ip 和 端口號(80)
局域網:服務器經過網線(無線鏈接) 每一個電腦都會有一個ip
外網:
ip:肯定服務器主機的位置
port(端口):肯定服務器裏的某個程序
### api接口的書寫
接受數據
-- get req.query
-- post req.body 須要body-parser 插件進行解析
注意數據格式 json x-www-form-urencode formdata
###中間件 middlewear
內置中間件 static
自定義中間件 (全局和局部)
第三方中間件 (body - parser)
在合適的地方執行next
###靜態資源目錄 static (相似apache的www)
### 非關係數據庫(文檔) mongodb
1.下載
2.安裝
處理異步的經常使用方式
promise asyc/awiat (es7)
promise //解決異步回調處理
封裝的promise函數有兩個參數(reslove,reject)而且會執行兩個外部函數then和catch
執行reslove表示成功,外部會走then()函數;;執行reject表示失敗,外部會走catch()函數
封裝好promise後能夠進行鏈式調用,只須要一個catch()
####自制一個簡單的登錄模塊##################
1.註冊登錄 mongod
2.驗證碼邏輯接口實現
a.驗證用戶名存在
b.獲取驗證碼
1.獲取郵箱驗證接口 :發送郵件 ; 郵箱和驗證碼保存在內存中、
2.5分鐘以內,不能重複發送(利用時間戳來計算時間)
3.apidoc 自動生前api接口文檔
全局安裝 apidoc 模塊
實現socket的方式
1.net
2.socket.io 麻煩 兼容性最好
3.websocket h5新增 低版本瀏覽器不兼容 使用簡單
======================
前端後端 都要建立服務器鏈接
1.搭建socket 服務器 後:new WebSocket.server({prot:8080},()=>{ })
ws.onOpen( ) //開啓監聽
2.前端進行鏈接 前: new WebSocket(' ws://localsocket:8080' );
ws.onOpen( ) //前端開啓鏈接
=======================
數據交互
client.on( ' message ', ( )=>{ } ) //有數據傳遞到服務器端就觸發 (都是被動監聽接受數據)
3.前端主動發送數據
4.後端主動發送數據
ws.onmessage = ( )=>{ } //有數據傳遞到前端就觸發 (都是被動監聽接受數據)
//主動發送都是使用 ws.send( )
=======================
先後端斷開的處理
後: ws.on('close') ;
前: ws.onClose( ) ;
5.斷開鏈接
何時用長鏈接
1.實時刷新(輪詢)
2.服務端發起數據
#### 身份驗證
http請求 無狀態
1.登錄時候 發佈一個加密字符串 (用戶相關信息) 給前端
2.調用其餘接口 加密字符串 做爲參數傳遞給服務器
3.根據權限進行驗證
session+cookie
cookie-parse
express-session
jwt