後端知識點總結——NODE.JS基礎

楷楷發表於2019-02-16

後端知識點總結——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();

  1. Node.js 原生模組—QueryString

 querystring模組用於處理HTTP請求URL中查詢字串
 var obj = qs.parse(str);   把查詢字串解析js物件
 var str = qs.stringify(obj) 把js物件轉換為查詢字串
 
  1. Node.js 原生模組—URL

url模組用於解析一個HTTP請求地址,獲取其中各個部分
var obj = url.parse(str); 把一個URL地址為js物件
var obj = url.parse(str,true); 功能同上,並且把其中查詢字串轉換

                      js obj
  1. 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){})
                    函式:檔案追加結束

  1. 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 ->mysqlRedis

      微博/微信    微博[點贊]   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

相關文章