後端知識點總結——NODE.JS基礎
1.Node.js
Node.js不是JS,是一種軟體開發平臺,它的競爭物件JSP/PHP/ASP.NET,歷史第一次有一種語言可以通吃前後端.
網站:阿里雲映象
https://npm.taobao.org/mirrors/node/
版本:0.12(16年初) 4.x(16年中) 6.x(16年底)
LTS:Long Term Support
Current:最新版本
JSP = HTML+JAVA 功能強大可靠,適合大型企業級專案
PHP = HTML+PHP 簡單易用,適合網際網路專案
ASP.NET = HTML+C# 易用,適合windows 平臺
30w==2w+0.5w+20w+10w
Node.JS = HTML+”JS” 效能好,適合伺服器端IO密集型專案,
不適合CPU密集型專案
CPU密集專案:滴滴叫車,天氣預報,大資料分析,大資料計算..
IO密集專案:查詢,修改,刪除,
2.Node執行的兩種方式
(1)互動模組—簡單瞭解(測試新功能)
REPL:輸入一行程式碼執行一行
注意:互動模自帶輸出功能,不必一定要 console.log()
node 回車 進入互動模式
.exit 退出
(2)指令碼模組—正式專案中使用
把要執行所有語句編寫一個文字檔案中(字尾任意,沒有),一次性提交node解析器執行.
node 完整路徑/x.js 回車
提交:只要安裝成node.js,重啟webstorm,ws可以自動發現node.exe解析,
新的專案和檔案編寫一定UTF-8
3.nodejs中特有概念—模組—(重點)
一個專案中多個”模組”,訂單模組,使用者模組,支付模組….
node.js按照功能,可以把函式,物件分別儲存不同檔案或目錄下,
這些目錄和檔案在node.js稱為一個“模組”
04_node.js 05.js
##注意:Node.JS每個一個模組都是一個獨立建構函式,
Node.JS解析器自動為每一個.js檔案新增如下程式碼.
(function(exports,require,module,__filename,__dirname){
exports:{} 用於宣告向外部匯出自己成員
require:fn 用於匯入其它的模組,並且建立指定模組物件
module: 當前模組物件
__filename
__dirname
var i = 10;
var j = 11;
console.log(i+j);
});
4.Node.js 模組中exports和module.exports物件區別是什麼?
二者都可以用於向外匯出自己內部成員,
但:實際向外匯出成員 module.exports
exports 對應一個引用
每個模組都可以使用自己require();引入另一個模組—底層本質是建立指定模組一個物件例項.
08_data.js 宣告二個變數一個函式 ->匯出一個變數一個函式
09_app.js 引入
5.nodejs 模組-目錄模組
自定義模組的兩種形式
(1)檔案模組
建立一個JS檔案,如m3.js,匯出其公開資料,
其它模組可以require("./m3");引入
(2)目錄模組
方式一:建立一個目錄,假設m4,其中建立index.js檔案,導
出需要公開資料。其它模組引入
var m = require(“./m4”);
方式二:建立一個目錄,假設m5,其中建立5.js檔案,匯出需要
公開資料資料,建立package.json檔案 main指定啟動
檔案 5.js 其它模組引入
var m = require(“./m5”);
方式三:建立一個目錄,必須名為 node_modules
,其中再建立目錄模組,假設 m6 其中建立 package.json
檔案,其中宣告 main屬性指定預設執行啟動js,如6.js,
其中匯出需要公共資料,其它模組引入
require(“m6”);
檔案模組 目錄模組(方式三)
程式結構 m1.js node_modules
m2
package.json
2.js
模組名稱 m1 m2
匯出資料 module.exports module.exports
匯入模組 var m = require(“./m1”); var m = require(“m2”);
6.Node.js 解析引擎自帶 原生模組—Buffer(緩衝區)
Buffer:緩衝區,本質上是一塊記憶體區域,用於暫存以後要用到資料
(數字,字串,二進位制圖片/音訊/視訊),該區域稱為“快取”
分配置一個指定大小緩衝區 1024位元組
建議:緩衝區大小不超過 512KB 512*1024
var buff1 = Buffer.alloc(1024);
使用一個陣列建立緩衝區
var buff2 = Buffer.from([1,2,3]);
使用一個字串建立緩衝區
var buff4 = Buffer.from(“abc”);
將一個緩衝區內容轉換字串{如果緩衝區資料是字串}
var str = buff4.toString();
- Node.js 原生模組—QueryString
querystring模組用於處理HTTP請求URL中查詢字串
var obj = qs.parse(str); 把查詢字串解析js物件
var str = qs.stringify(obj) 把js物件轉換為查詢字串
- Node.js 原生模組—URL
url模組用於解析一個HTTP請求地址,獲取其中各個部分
var obj = url.parse(str); 把一個URL地址為js物件
var obj = url.parse(str,true); 功能同上,並且把其中查詢字串轉換
js obj
- Node.js 原生模組—fs—(重點)
檔案:在node.js 我們系統檔案或者目錄統稱為檔案
fs 模組提供對檔案和目錄進行,增刪改查,讀定檔案內容
(1) 同步讀寫檔案(阻塞)
同步讀取檔案內容 var data = fs.readFileSync(fileName);
同步向檔案寫內容 fs.writeFileSync(fileName,data);
注意:(1)如果當前寫入檔案並不存在,自動建立一個
a.txt
(2)如果當前寫入目錄並不存在,報錯
d:/abc/a.txt
(3)如果當前檔案己經存在內容,清空
同步向檔案追加內容
fs.appendFileSync(fileName,data);
(2) 非同步讀寫檔案(非阻塞)
非同步讀取資料 fs.readFile(fileName,function(err,data){ });
函式:檔案讀取完成後呼叫
err:讀取檔案不存在,許可權不足,
自動建立錯誤物件
#非同步寫資料 fs.writeFile(fileName,data,function(err){})
函式:檔案寫結束呼叫
#非同步追加資料 fs.appendFile(fileName,data,function(err){})
函式:檔案追加結束
- Node.js 原生模組–http
HTTP 模組可用於編寫基於HTTP協議客戶端程式(即瀏覽器),也可以編寫一個基於HTTP協議伺服器(APACHE)
APACHE[1000併發量] nginx[28000] IIS[微軟]
用http模組編寫一個web伺服器
(1)建立伺服器物件 var server = http.createServer();
(2)繫結監聽埠 1-65535 server.listen(3000);
(3)接收客戶端請求, server.on(“request”,(req,res)=>{..})
(4)並且響應客戶訊息 res.end(str...);
req:請求物件:儲存客戶端請求訊息
req.url 請求url地址
res:響應物件:伺服器傳送資料客戶端,修改響應格式
三個常用物件:
(1) server 代表伺服器物件
(2) req (request)請求物件,儲存客戶端很多資訊
req.url 客戶請求地址
req.method 客戶請求方式
req.httpVersion HTTP版本
req.headers 請求頭
(3) res (response)響應物件,儲存伺服器端向客戶傳送資料
res.statusCode = 200;
res.setHeader(); 設定響應頭
res.write(); 向客戶端輸入響應訊息主體
res.end(); 通知客戶端,響應訊息結束(只能一次)
常見錯誤:程式埠被佔用
listen EADDRINUSE :::3000
解決:查詢前面程式停止即可
11.node.js 第三方模組 (mysql/express)
使用node.js訪問mysql伺服器
為了精簡NODE.JS解析器,官方沒有提供訪問任何資料庫相關模組,
必須使用工具 npm 下載第三方模組,在www.npmjs.org 搜尋關鍵字
Mysql 可以得到相關模組,每個模組使用說明.
示例:下載
npm install mysql 簡寫 npm i mysql
mysql模組使用步驟
(1)複製模組 node_modules day03根目錄下
(2)載入mysql模組 const mysql = require(“mysql”);
(3)建立到資料庫伺服器連線
var conn = mysql.createConnection({})
(4)傳送sql語句並且獲取伺服器返回結果
conn.query(sql,(err,result)=>{});
(5)關閉連線 conn.end();
12.nodejs第三方模組express (重點)
下載express 模組
npm i express http高階模組
npm i body-parser 處理post請求
npm i cookie-parser 處理cookie
npm i express-session 處理session
npm i cors 跨域
express模組
使用官方提供HTTP模組可以建立一個web伺服器應用,但此模組
非常底層,要處理各種情形,比較繁瑣。推薦使用HTTP高層模組,
express—第三方模組,是一個基於node.js http模組的高層模組,簡化
伺服器端開發。
(1) 下載模組 npm i express
(2) 將模組內容複製專案中 day04/node_modules
(3) 載入相應模組 http/express
(4) 建立express物件,再建立伺服器物件,並且繫結監聽埠
var app = express();
var server = http.createServer(app);
server.listen(3000);
常規語法規則:
app.get(請求地址,回撥函式);
接收客戶請求 GET /index.html
app.get(“/index.html”,(req,res)=>{});
接收客戶請求 POST /index.html
app.post(“/index.html”,(req,res)=>{});
示例:
以前:login.php 引數 資料庫 json
$.get(“login.php”,…..);
現在:app.get(“/login.do”,(req,res)=>{
引數 資料庫 json
});
$.get(“/login.do”…..);
13.express req和res物件
res.sendFile(__dirname+檔案絕對路徑); =fs.read+res.write+res.end
res.send(向客戶端返回html字串響應);
res.json(obj); =setHead()+JSON.parse()+res.write()+res.end()
express GET 請求 接收引數二種方法
#GET /login.do?uid=10&uname=tom
app.get(“/login.do”,(req,res)=>{
//express為每一個req物件新增屬性query
req.query.uid;
req.query.uname;
});
GET /login.do/12/tom
app.get(“/login.do/:uid/:uname”,(req,res)=>{
//express 為每個req物件新增一個params 屬性
req.params.uid
req.params.uname
});
14.為了專案提高效率建立連線池
(1)建立連線池
var pool = mysql.createPool({…}); host;user;password;
connectionLimit:5 連線池中活動連線5個
建議範圍:5~25
1億(PV/1day)= 8小時=28800秒=10-100=34/s
100000000/28800/100=
(2)所有應用程式 租連線
pool.getConnection((err,conn)=>{
});
(3)歸還連線 conn.release();
15.請求方式:HTTP協議
請求方法:用於標識此次請求的目的
GET 表示客戶端想”獲得”指定資源
POST 表示客戶端想”上傳/新增”指定資料給伺服器,
請求資料在請求主體中
PUT 表示客戶端想”放置”資料在伺服器
DELETE 表示客戶端想”刪除”伺服器上指定資源
16.傳送請求
瀏覽器傳送GET請求
位址列輸入url回車/表單GET/AJAX GET/超連結/js跳轉/img src
瀏覽器傳送POST請求
表單POST/AJAX POST
瀏覽器傳送DELETE請求
AJAX-DELETE
瀏覽器傳送PUT請求
AJAX-PUT
專案:{跨域}
兩臺web伺服器 {nodejs 伺服器業務功能}
{apaceh 伺服器接收請求響應html靜態資源}
一臺資料庫伺服器 {資料 mysql伺服器}
擴充套件思路與知識儲備
注意事項:
如果客戶端跨域請求伺服器資源為了儲存session工作正確
需要在ajax請求新增屬性
xhrFields:{withCredentials:true}
17.專案瓶頸:資料庫
原理:資料庫中資料儲存在磁碟上的某一組檔案
解決一:提供SQL查詢效率
SELECT uid,uname,age FROM xz_user;
資料庫物件:索引 提高查詢效率[select];
降低更新效率[update/delete/insert]
什麼專案用:索引 查詢多更新少
索引為什麼快:工作原理
美團快遞:送餐{死心眼} 資料庫預設工作方式
美團快遞:送餐{機靈}
ALTER TABLE xz_user ADD INDEX (uname)
SELECT uid FROM xz_user WHERE uname = “tom”;
400w-沒有加索引之前 查詢一條記錄 2s
400w->加索引之後 查詢一條記錄 0.00002s
解決二:主從資料庫伺服器{一個伺服器負責寫資料<主>}
{多個從伺服器負責讀資料<從>}
解決三:記憶體級資料庫伺服器{NOSQL} 極高資料讀寫 Redis
資料庫讀寫速度太高->資料庫壓力太大{出問題} cpu 100%
社群:php/mysql 線上人數 t_online 2 伺服器down
$phpcount = 1; ->redis ++ -- 效率很好
tts:學生登入 8:45~9:30 ->mysqlRedis
微博/微信 微博[點贊] 120 Redis
(2)提高專案{PV Page View} 高效能伺服器/頁面靜態化
Nginx/
(3)安全形度
SQL 注入 node.js ?
XSS 攻擊 指令碼 oa[報銷/申請辦公用品/審批] [確認]
document.all.readonly = true
過濾使用者所有輸入值/所有危險字串判斷
DDOS 攻擊 向某個網站傳送大量垃圾 防火牆
解決:網店->天貓->阿里雲 6G/s
(4)資料分析資料探勘(大資料/人工智慧)
18.中介軟體-(路由級中介軟體)
1.Express 是一個自身功能極簡,完全是中介軟體構成web框架
從本質上講一個express應用就是由中介軟體組成系統.
2.中介軟體(Middleware)是一個函式,它可以訪問請求物件和響應物件
(req request,res response),可以控制請求-響應流程,有一個引數
next變數 下一個中介軟體
3.中介軟體功能包括
執行任何程式碼
修改請求和響應物件
終結請求-響應迴圈 [攔載器]
呼叫下一個中介軟體
4.中介軟體分類
應用級中介軟體(*)
路由級中介軟體(*)
錯誤處理中介軟體
內建中介軟體
5.標準語法
app.use(url,(req,res,next)=>{
});
url:攔載地址(觸發地址)
req:請求物件
res:響應物件
next:呼叫下一個中介軟體或路由
6.路由中介軟體
路由 = 請求方法+請求地址+處理函式
示例: app.get(“/list”,(req,res)=>{…})
語法
var router = express.Router(); //建立路由中介軟體物件
router.get(“/find”,(req,res)=>{});
router.post(“/list”,(req,res)=>{});
module.exports = router;
app.use(“/user”,router);
http://127.0.0.1:3000/user/find
http://127.0.0.1:3000/user/list
(1)建立三個路由檔案
router/userRouter.js 儲存所有使用者功能
router/orderRouter.js 儲存所有訂單功能
router/productRouter.js 儲存所有產品功能
app.js
var userRouter = require(“./router/userRouter”);
var orderRouter = require(“./router/orderRouter”);
var productRouter = require(“./router/productRouter”);
app.use(“/user”,userRouter);
app.use(“/order”, orderRouter);
app.use(“/product”, productRouter);
http://127.0.0.1:3000/user/list
http://127.0.0.1:3000/order/list