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

後端知識點總結——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 平臺php

30w==2w+0.5w+20w+10w

Node.JS = HTML+」JS」 性能好,適合服務器端IO密集型項目,html

不適合CPU密集型項目

CPU密集項目:滴滴打車,天氣預報,大數據分析,大數據計算..
IO密集項目:查詢,修改,刪除,node

2.Node運行的兩種方式

(1)交互模塊---簡單瞭解(測試新功能)
REPL:輸入一行代碼執行一行
注意:交互模自帶輸出功能,沒必要必定要 console.log()
node 回車 進入交互模式
.exit 退出mysql

(2)腳本模塊—正式項目中使用nginx

把要執行全部語句編寫一個文本文件中(後綴任意,沒有),一次性提交node解析器執行.
  node 完整路徑/x.js 回車
  提交:只要安裝成node.js,重啓webstorm,ws能夠自動發現node.exe解析,
  新的項目和文件編寫必定UTF-8

3.nodejs中特有概念—模塊---(重點)

一個項目中多個」模塊」,訂單模塊,用戶模塊,支付模塊....web

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;ajax

var j = 11;
         console.log(i+j);

});redis

4.Node.js 模塊中exports和module.exports對象區別是什麼?

兩者均可以用於向外導出本身內部成員,
但:實際向外導出成員 module.exports
exports 對應一個引用sql

每一個模塊均可以使用本身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

相關文章
相關標籤/搜索