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
(1)交互模塊---簡單瞭解(測試新功能)
REPL:輸入一行代碼執行一行
注意:交互模自帶輸出功能,沒必要必定要 console.log()
node 回車 進入交互模式
.exit 退出mysql
(2)腳本模塊—正式項目中使用nginx
把要執行全部語句編寫一個文本文件中(後綴任意,沒有),一次性提交node解析器執行. node 完整路徑/x.js 回車 提交:只要安裝成node.js,重啓webstorm,ws能夠自動發現node.exe解析, 新的項目和文件編寫必定UTF-8
一個項目中多個」模塊」,訂單模塊,用戶模塊,支付模塊....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
兩者均可以用於向外導出本身內部成員,
但:實際向外導出成員 module.exports
exports 對應一個引用sql
每一個模塊均可以使用本身require();引入另外一個模塊—底層本質是建立指定模塊一個對象實例. 08_data.js 聲明二個變量一個函數 ->導出一個變量一個函數 09_app.js 引入
自定義模塊的兩種形式
(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」);
Buffer:緩衝區,本質上是一塊內存區域,用於暫存之後要用到數據
(數字,字符串,二進制圖片/音頻/視頻),該區域稱爲「緩存」
建議:緩衝區大小不超過 512KB 512*1024
var buff1 = Buffer.alloc(1024);
var buff2 = Buffer.from([1,2,3]);
var buff4 = Buffer.from(「abc」);
var str = buff4.toString();
querystring模塊用於處理HTTP請求URL中查詢字符串 var obj = qs.parse(str); 把查詢字符串解析js對象 var str = qs.stringify(obj) 把js對象轉換爲查詢字符串
url模塊用於解析一個HTTP請求地址,獲取其中各個部分
var obj = url.parse(str); 把一個URL地址爲js對象
var obj = url.parse(str,true); 功能同上,而且把其中查詢字符串轉換
js obj
文件:在node.js 咱們系統文件或者目錄統稱爲文件
fs 模塊提供對文件和目錄進行,增刪改查,讀定文件內容
(1) 同步讀寫文件(阻塞)
注意:(1)若是當前寫入文件並不存在,自動建立一個
a.txt (2)若是當前寫入目錄並不存在,報錯 d:/abc/a.txt (3)若是當前文件己經存在內容,清空
fs.appendFileSync(fileName,data);
(2) 異步讀寫文件(非阻塞)
函數:文件讀取完成後調用 err:讀取文件不存在,權限不足, 自動建立錯誤對象 #異步寫數據 fs.writeFile(fileName,data,function(err){}) 函數:文件寫結束調用 #異步追加數據 fs.appendFile(fileName,data,function(err){}) 函數:文件追加結束
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
解決:查找前面程序中止便可
使用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();
下載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(請求地址,回調函數);
app.get(「/index.html」,(req,res)=>{});
app.post(「/index.html」,(req,res)=>{});
示例:
之前:login.php 參數 數據庫 json
$.get(「login.php」,…..);
如今:app.get(「/login.do」,(req,res)=>{
參數 數據庫 json
});
$.get(「/login.do」…..);
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;
});
app.get(「/login.do/:uid/:uname」,(req,res)=>{
//express 爲每一個req對象添加一個params 屬性
req.params.uid
req.params.uname
});
(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();
請求方法:用於標識這次請求的目的 GET 表示客戶端想」得到」指定資源 POST 表示客戶端想」上傳/添加」指定數據給服務器,
請求數據在請求主體中
PUT 表示客戶端想」放置」數據在服務器 DELETE 表示客戶端想」刪除」服務器上指定資源
瀏覽器發送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}
原理:數據庫中數據保存在磁盤上的某一組文件
解決一:提供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)數據分析數據挖掘(大數據/人工智能)
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