摘要:后端知識點總結基礎不是是一種軟件開發平臺,它的競爭對象歷史第一次有一種語言可以通吃前后端網站阿里云鏡像版本年初年中年底最新版本功能強大可靠,適合大型企業級項目簡單易用適合互聯網項目易用適合平臺性能好適合服務器端密集型項目不適合密集型項目密集
后端知識點總結——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密集項目:查詢,修改,刪除,
(1)交互模塊---簡單了解(測試新功能)
REPL:輸入一行代碼執行一行
注意:交互模自帶輸出功能,不必一定要 console.log()
node 回車 進入交互模式
.exit 退出
(2)腳本模塊—正式項目中使用
把要執行所有語句編寫一個文本文件中(后綴任意,沒有),一次性提交node解析器執行. node 完整路徑/x.js 回車 提交:只要安裝成node.js,重啟webstorm,ws可以自動發現node.exe解析, 新的項目和文件編寫一定UTF-83.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”);
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();
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) 同步讀寫文件(阻塞)
注意:(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
解決:查找前面程序停止即可
使用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(請求地址,回調函數);
app.get(“/index.html”,(req,res)=>{});
接收客戶請求 POST /index.htmlapp.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;
});
GET /login.do/12/tomapp.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 表示客戶端想”刪除”服務器上指定資源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}
原理:數據庫中數據保存在磁盤上的某一組文件
解決一:提供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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/94158.html
摘要:異步最佳實踐避免回調地獄前端掘金本文涵蓋了處理異步操作的一些工具和技術和異步函數。 Nodejs 連接各種數據庫集合例子 - 后端 - 掘金Cassandra Module: cassandra-driver Installation ... 編寫 Node.js Rest API 的 10 個最佳實踐 - 前端 - 掘金全文共 6953 字,讀完需 8 分鐘,速讀需 2 分鐘。翻譯自...
摘要:文本已收錄至我的倉庫,歡迎前后端分離這個詞相信大家都聽過,不知道大家是怎么理解的呢。流下不學無術的淚水目前我了解到的前后端分離,首先部署是分離的至少不會跟綁定在一起部署接口只返回數據關于前端這幾大框架這幾個我都是沒有寫過的,所以也就不多了。 前言 只有光頭才能變強。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y ...
摘要:年終總結結果到這個時間才寫,其實也是無奈。這一年最重要的事情就是順利從一只學生狗轉職為一只社畜。四月份畢業之后以前端工程師的職位入職天貓,到現在也差不多工作一年了。 年終總結結果到這個時間才寫,其實也是無奈。本來計劃過年寫的,沒想到Steam竟然開了個農歷春節特惠,然后就被各種游戲打了,辣雞平臺,斂我錢財,頹我精神,耗我青春,害我單身 以下全都是個人看法,如果有不認同的地方,請大吼一聲...
摘要:年終總結結果到這個時間才寫,其實也是無奈。這一年最重要的事情就是順利從一只學生狗轉職為一只社畜。四月份畢業之后以前端工程師的職位入職天貓,到現在也差不多工作一年了。 年終總結結果到這個時間才寫,其實也是無奈。本來計劃過年寫的,沒想到Steam竟然開了個農歷春節特惠,然后就被各種游戲打了,辣雞平臺,斂我錢財,頹我精神,耗我青春,害我單身 以下全都是個人看法,如果有不認同的地方,請大吼一聲...
摘要:問題回答者黃軼,目前就職于公司擔任前端架構師,曾就職于滴滴和百度,畢業于北京科技大學。最后附上鏈接問題我目前是一名后端工程師,工作快五年了。 showImg(https://segmentfault.com/img/bVbuaiP?w=1240&h=620); 問題回答者:黃軼,目前就職于 Zoom 公司擔任前端架構師,曾就職于滴滴和百度,畢業于北京科技大學。 1. 前端開發 問題 大...
閱讀 3416·2023-04-26 02:41
閱讀 2472·2023-04-26 00:14
閱讀 2891·2021-08-11 10:22
閱讀 1295·2019-12-27 11:38
閱讀 3583·2019-08-29 18:34
閱讀 2390·2019-08-29 12:13
閱讀 2964·2019-08-26 18:26
閱讀 1878·2019-08-26 16:49