摘要:后端知識(shí)點(diǎn)總結(jié)基礎(chǔ)不是是一種軟件開(kāi)發(fā)平臺(tái),它的競(jìng)爭(zhēng)對(duì)象歷史第一次有一種語(yǔ)言可以通吃前后端網(wǎng)站阿里云鏡像版本年初年中年底最新版本功能強(qiáng)大可靠,適合大型企業(yè)級(jí)項(xiàng)目簡(jiǎn)單易用適合互聯(lián)網(wǎng)項(xiàng)目易用適合平臺(tái)性能好適合服務(wù)器端密集型項(xiàng)目不適合密集型項(xiàng)目密集
后端知識(shí)點(diǎn)總結(jié)——NODE.JS基礎(chǔ) 1.Node.js
Node.js不是JS,是一種軟件開(kāi)發(fā)平臺(tái),它的競(jìng)爭(zhēng)對(duì)象JSP/PHP/ASP.NET,歷史第一次有一種語(yǔ)言可以通吃前后端. 網(wǎng)站:阿里云鏡像 https://npm.taobao.org/mirrors/node/ 版本:0.12(16年初) 4.x(16年中) 6.x(16年底) LTS:Long Term Support Current:最新版本
JSP = HTML+JAVA 功能強(qiáng)大可靠,適合大型企業(yè)級(jí)項(xiàng)目
PHP = HTML+PHP 簡(jiǎn)單易用,適合互聯(lián)網(wǎng)項(xiàng)目
ASP.NET = HTML+C# 易用,適合windows 平臺(tái)
30w==2w+0.5w+20w+10w
Node.JS = HTML+”JS” 性能好,適合服務(wù)器端IO密集型項(xiàng)目,
不適合CPU密集型項(xiàng)目
CPU密集項(xiàng)目:滴滴打車,天氣預(yù)報(bào),大數(shù)據(jù)分析,大數(shù)據(jù)計(jì)算..
IO密集項(xiàng)目:查詢,修改,刪除,
(1)交互模塊---簡(jiǎn)單了解(測(cè)試新功能)
REPL:輸入一行代碼執(zhí)行一行
注意:交互模自帶輸出功能,不必一定要 console.log()
node 回車 進(jìn)入交互模式
.exit 退出
(2)腳本模塊—正式項(xiàng)目中使用
把要執(zhí)行所有語(yǔ)句編寫(xiě)一個(gè)文本文件中(后綴任意,沒(méi)有),一次性提交node解析器執(zhí)行. node 完整路徑/x.js 回車 提交:只要安裝成node.js,重啟webstorm,ws可以自動(dòng)發(fā)現(xiàn)node.exe解析, 新的項(xiàng)目和文件編寫(xiě)一定UTF-83.nodejs中特有概念—模塊---(重點(diǎn))
一個(gè)項(xiàng)目中多個(gè)”模塊”,訂單模塊,用戶模塊,支付模塊....
node.js按照功能,可以把函數(shù),對(duì)象分別保存不同文件或目錄下, 這些目錄和文件在node.js稱為一個(gè)“模塊” 04_node.js 05.js ##注意:Node.JS每個(gè)一個(gè)模塊都是一個(gè)獨(dú)立構(gòu)造函數(shù), Node.JS解析器自動(dòng)為每一個(gè).js文件添加如下代碼. (function(exports,require,module,__filename,__dirname){ exports:{} 用于聲明向外部導(dǎo)出自己成員 require:fn 用于導(dǎo)入其它的模塊,并且創(chuàng)建指定模塊對(duì)象 module: 當(dāng)前模塊對(duì)象 __filename __dirname
var i = 10;
var j = 11; console.log(i+j);
});
4.Node.js 模塊中exports和module.exports對(duì)象區(qū)別是什么?二者都可以用于向外導(dǎo)出自己內(nèi)部成員,
但:實(shí)際向外導(dǎo)出成員 module.exports
exports 對(duì)應(yīng)一個(gè)引用
每個(gè)模塊都可以使用自己require();引入另一個(gè)模塊—底層本質(zhì)是創(chuàng)建指定模塊一個(gè)對(duì)象實(shí)例. 08_data.js 聲明二個(gè)變量一個(gè)函數(shù) ->導(dǎo)出一個(gè)變量一個(gè)函數(shù) 09_app.js 引入5.nodejs 模塊-目錄模塊
自定義模塊的兩種形式
(1)文件模塊
創(chuàng)建一個(gè)JS文件,如m3.js,導(dǎo)出其公開(kāi)數(shù)據(jù), 其它模塊可以require("./m3");引入
(2)目錄模塊
方式一:創(chuàng)建一個(gè)目錄,假設(shè)m4,其中創(chuàng)建index.js文件,導(dǎo) 出需要公開(kāi)數(shù)據(jù)。其它模塊引入 var m = require(“./m4”); 方式二:創(chuàng)建一個(gè)目錄,假設(shè)m5,其中創(chuàng)建5.js文件,導(dǎo)出需要 公開(kāi)數(shù)據(jù)數(shù)據(jù),創(chuàng)建package.json文件 main指定啟動(dòng)
文件 5.js 其它模塊引入
var m = require(“./m5”); 方式三:創(chuàng)建一個(gè)目錄,必須名為 node_modules ,其中再創(chuàng)建目錄模塊,假設(shè) m6 其中創(chuàng)建 package.json 文件,其中聲明 main屬性指定默認(rèn)執(zhí)行啟動(dòng)js,如6.js, 其中導(dǎo)出需要公共數(shù)據(jù),其它模塊引入 require(“m6”); 文件模塊 目錄模塊(方式三)
程序結(jié)構(gòu) m1.js node_modules
m2 package.json 2.js
模塊名稱 m1 m2
導(dǎo)出數(shù)據(jù) module.exports module.exports
導(dǎo)入模塊 var m = require(“./m1”); var m = require(“m2”);
Buffer:緩沖區(qū),本質(zhì)上是一塊內(nèi)存區(qū)域,用于暫存以后要用到數(shù)據(jù)
(數(shù)字,字符串,二進(jìn)制圖片/音頻/視頻),該區(qū)域稱為“緩存”
建議:緩沖區(qū)大小不超過(guò) 512KB 512*1024
var buff1 = Buffer.alloc(1024);使用一個(gè)數(shù)組創(chuàng)建緩沖區(qū)
var buff2 = Buffer.from([1,2,3]);使用一個(gè)字符串創(chuàng)建緩沖區(qū)
var buff4 = Buffer.from(“abc”);
將一個(gè)緩沖區(qū)內(nèi)容轉(zhuǎn)換字符串{如果緩沖區(qū)數(shù)據(jù)是字符串}var str = buff4.toString();
Node.js 原生模塊—QueryString
querystring模塊用于處理HTTP請(qǐng)求URL中查詢字符串 var obj = qs.parse(str); 把查詢字符串解析js對(duì)象 var str = qs.stringify(obj) 把js對(duì)象轉(zhuǎn)換為查詢字符串
Node.js 原生模塊—URL
url模塊用于解析一個(gè)HTTP請(qǐng)求地址,獲取其中各個(gè)部分
var obj = url.parse(str); 把一個(gè)URL地址為js對(duì)象
var obj = url.parse(str,true); 功能同上,并且把其中查詢字符串轉(zhuǎn)換
js obj
Node.js 原生模塊—fs—(重點(diǎn))
文件:在node.js 我們系統(tǒng)文件或者目錄統(tǒng)稱為文件
fs 模塊提供對(duì)文件和目錄進(jìn)行,增刪改查,讀定文件內(nèi)容
(1) 同步讀寫(xiě)文件(阻塞)
注意:(1)如果當(dāng)前寫(xiě)入文件并不存在,自動(dòng)創(chuàng)建一個(gè)
a.txt (2)如果當(dāng)前寫(xiě)入目錄并不存在,報(bào)錯(cuò) d:/abc/a.txt (3)如果當(dāng)前文件己經(jīng)存在內(nèi)容,清空同步向文件追加內(nèi)容
fs.appendFileSync(fileName,data);
(2) 異步讀寫(xiě)文件(非阻塞)
異步讀取數(shù)據(jù) fs.readFile(fileName,function(err,data){ });函數(shù):文件讀取完成后調(diào)用 err:讀取文件不存在,權(quán)限不足, 自動(dòng)創(chuàng)建錯(cuò)誤對(duì)象 #異步寫(xiě)數(shù)據(jù) fs.writeFile(fileName,data,function(err){}) 函數(shù):文件寫(xiě)結(jié)束調(diào)用 #異步追加數(shù)據(jù) fs.appendFile(fileName,data,function(err){}) 函數(shù):文件追加結(jié)束
Node.js 原生模塊--http
HTTP 模塊可用于編寫(xiě)基于HTTP協(xié)議客戶端程序(即瀏覽器),也可以編寫(xiě)一個(gè)基于HTTP協(xié)議服務(wù)器(APACHE)
APACHE[1000并發(fā)量] nginx[28000] IIS[微軟](méi)
用http模塊編寫(xiě)一個(gè)web服務(wù)器
(1)創(chuàng)建服務(wù)器對(duì)象 var server = http.createServer(); (2)綁定監(jiān)聽(tīng)端口 1-65535 server.listen(3000); (3)接收客戶端請(qǐng)求, server.on(“request”,(req,res)=>{..}) (4)并且響應(yīng)客戶消息 res.end(str...);
req:請(qǐng)求對(duì)象:保存客戶端請(qǐng)求消息
req.url 請(qǐng)求url地址
res:響應(yīng)對(duì)象:服務(wù)器發(fā)送數(shù)據(jù)客戶端,修改響應(yīng)格式
三個(gè)常用對(duì)象:
(1) server 代表服務(wù)器對(duì)象
(2) req (request)請(qǐng)求對(duì)象,保存客戶端很多信息
req.url 客戶請(qǐng)求地址
req.method 客戶請(qǐng)求方式
req.httpVersion HTTP版本
req.headers 請(qǐng)求頭
(3) res (response)響應(yīng)對(duì)象,保存服務(wù)器端向客戶發(fā)送數(shù)據(jù)
res.statusCode = 200;
res.setHeader(); 設(shè)置響應(yīng)頭
res.write(); 向客戶端輸入響應(yīng)消息主體
res.end(); 通知客戶端,響應(yīng)消息結(jié)束(只能一次)
常見(jiàn)錯(cuò)誤:程序端口被占用
listen EADDRINUSE :::3000
解決:查找前面程序停止即可
使用node.js訪問(wèn)mysql服務(wù)器
為了精簡(jiǎn)NODE.JS解析器,官方?jīng)]有提供訪問(wèn)任何數(shù)據(jù)庫(kù)相關(guān)模塊,
必須使用工具 npm 下載第三方模塊,在www.npmjs.org 搜索關(guān)鍵字
Mysql 可以得到相關(guān)模塊,每個(gè)模塊使用說(shuō)明.
示例:下載 npm install mysql 簡(jiǎn)寫(xiě) npm i mysql
mysql模塊使用步驟
(1)復(fù)制模塊 node_modules day03根目錄下
(2)加載mysql模塊 const mysql = require(“mysql”);
(3)創(chuàng)建到數(shù)據(jù)庫(kù)服務(wù)器連接
var conn = mysql.createConnection({})
(4)發(fā)送sql語(yǔ)句并且獲取服務(wù)器返回結(jié)果
conn.query(sql,(err,result)=>{});
(5)關(guān)閉連接 conn.end();
12.nodejs第三方模塊express (重點(diǎn))下載express 模塊
npm i express http高級(jí)模塊
npm i body-parser 處理post請(qǐng)求
npm i cookie-parser 處理cookie
npm i express-session 處理session
npm i cors 跨域
express模塊
使用官方提供HTTP模塊可以創(chuàng)建一個(gè)web服務(wù)器應(yīng)用,但此模塊
非常底層,要處理各種情形,比較繁瑣。推薦使用HTTP高層模塊,
express—第三方模塊,是一個(gè)基于node.js http模塊的高層模塊,簡(jiǎn)化
服務(wù)器端開(kāi)發(fā)。
(1) 下載模塊 npm i express
(2) 將模塊內(nèi)容復(fù)制項(xiàng)目中 day04/node_modules
(3) 加載相應(yīng)模塊 http/express
(4) 創(chuàng)建express對(duì)象,再創(chuàng)建服務(wù)器對(duì)象,并且綁定監(jiān)聽(tīng)端口
var app = express();
var server = http.createServer(app);
server.listen(3000);
常規(guī)語(yǔ)法規(guī)則:
app.get(請(qǐng)求地址,回調(diào)函數(shù));
app.get(“/index.html”,(req,res)=>{});
接收客戶請(qǐng)求 POST /index.htmlapp.post(“/index.html”,(req,res)=>{});
示例:
以前:login.php 參數(shù) 數(shù)據(jù)庫(kù) json
$.get(“l(fā)ogin.php”,…..);
現(xiàn)在:app.get(“/login.do”,(req,res)=>{
參數(shù) 數(shù)據(jù)庫(kù) json
});
$.get(“/login.do”…..);
res.sendFile(__dirname+文件絕對(duì)路徑); =fs.read+res.write+res.end
res.send(向客戶端返回html字符串響應(yīng));
res.json(obj); =setHead()+JSON.parse()+res.write()+res.end()
express GET 請(qǐng)求 接收參數(shù)二種方法
#GET /login.do?uid=10&uname=tom
app.get(“/login.do”,(req,res)=>{
//express為每一個(gè)req對(duì)象添加屬性query req.query.uid; req.query.uname;
});
GET /login.do/12/tomapp.get(“/login.do/:uid/:uname”,(req,res)=>{
//express 為每個(gè)req對(duì)象添加一個(gè)params 屬性
req.params.uid
req.params.uname
});
(1)創(chuàng)建連接池
var pool = mysql.createPool({…}); host;user;password;
connectionLimit:5 連接池中活動(dòng)連接5個(gè)
建議范圍:5~25
1億(PV/1day)= 8小時(shí)=28800秒=10-100=34/s
100000000/28800/100=
(2)所有應(yīng)用程序 租連接
pool.getConnection((err,conn)=>{
});
(3)歸還連接 conn.release();
請(qǐng)求方法:用于標(biāo)識(shí)此次請(qǐng)求的目的 GET 表示客戶端想”獲得”指定資源 POST 表示客戶端想”上傳/添加”指定數(shù)據(jù)給服務(wù)器,
請(qǐng)求數(shù)據(jù)在請(qǐng)求主體中
PUT 表示客戶端想”放置”數(shù)據(jù)在服務(wù)器 DELETE 表示客戶端想”刪除”服務(wù)器上指定資源16.發(fā)送請(qǐng)求
瀏覽器發(fā)送GET請(qǐng)求
地址欄輸入url回車/表單GET/AJAX GET/超鏈接/js跳轉(zhuǎn)/img src 瀏覽器發(fā)送POST請(qǐng)求 表單POST/AJAX POST 瀏覽器發(fā)送DELETE請(qǐng)求 AJAX-DELETE 瀏覽器發(fā)送PUT請(qǐng)求 AJAX-PUT
項(xiàng)目:{跨域}
兩臺(tái)web服務(wù)器 {nodejs 服務(wù)器業(yè)務(wù)功能}
{apaceh 服務(wù)器接收請(qǐng)求響應(yīng)html靜態(tài)資源}
一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器 {數(shù)據(jù) mysql服務(wù)器}
擴(kuò)展思路與知識(shí)儲(chǔ)備
注意事項(xiàng):
如果客戶端跨域請(qǐng)求服務(wù)器資源為了保存session工作正確
需要在ajax請(qǐng)求添加屬性
xhrFields:{withCredentials:true}
原理:數(shù)據(jù)庫(kù)中數(shù)據(jù)保存在磁盤(pán)上的某一組文件
解決一:提供SQL查詢效率
SELECT uid,uname,age FROM xz_user; 數(shù)據(jù)庫(kù)對(duì)象:索引 提高查詢效率[select];
降低更新效率[update/delete/insert]
什么項(xiàng)目用:索引 查詢多更新少 索引為什么快:工作原理 美團(tuán)快遞:送餐{死心眼} 數(shù)據(jù)庫(kù)默認(rèn)工作方式 美團(tuán)快遞:送餐{機(jī)靈} ALTER TABLE xz_user ADD INDEX (uname) SELECT uid FROM xz_user WHERE uname = “tom”; 400w-?沒(méi)有加索引之前 查詢一條記錄 2s 400w->加索引之后 查詢一條記錄 0.00002s
解決二:主從數(shù)據(jù)庫(kù)服務(wù)器{一個(gè)服務(wù)器負(fù)責(zé)寫(xiě)數(shù)據(jù)<主>}
{多個(gè)從服務(wù)器負(fù)責(zé)讀數(shù)據(jù)<從>}
解決三:內(nèi)存級(jí)數(shù)據(jù)庫(kù)服務(wù)器{NOSQL} 極高數(shù)據(jù)讀寫(xiě) Redis
數(shù)據(jù)庫(kù)讀寫(xiě)速度太高->數(shù)據(jù)庫(kù)壓力太大{出問(wèn)題} cpu 100% 社區(qū):php/mysql 在線人數(shù) t_online 2 服務(wù)器down $phpcount = 1; ->redis ++ -- 效率很好
tts:學(xué)生登錄 8:45~9:30 ->mysql?Redis
微博/微信 微博[點(diǎn)贊] 120 Redis
(2)提高項(xiàng)目{PV Page View} 高性能服務(wù)器/頁(yè)面靜態(tài)化
Nginx/
(3)安全角度
SQL 注入 node.js ? XSS 攻擊 腳本 oa[報(bào)銷/申請(qǐng)辦公用品/審批] [確認(rèn)] document.all.readonly = true 過(guò)濾用戶所有輸入值/所有危險(xiǎn)字符串判斷 DDOS 攻擊 向某個(gè)網(wǎng)站發(fā)送大量垃圾 防火墻 解決:網(wǎng)店->天貓->阿里云 6G/s
(4)數(shù)據(jù)分析數(shù)據(jù)挖掘(大數(shù)據(jù)/人工智能)
18.中間件-(路由級(jí)中間件)1.Express 是一個(gè)自身功能極簡(jiǎn),完全是中間件構(gòu)成web框架
從本質(zhì)上講一個(gè)express應(yīng)用就是由中間件組成系統(tǒng).
2.中間件(Middleware)是一個(gè)函數(shù),它可以訪問(wèn)請(qǐng)求對(duì)象和響應(yīng)對(duì)象
(req request,res response),可以控制請(qǐng)求-響應(yīng)流程,有一個(gè)參數(shù)
next變量 下一個(gè)中間件
3.中間件功能包括
執(zhí)行任何代碼
修改請(qǐng)求和響應(yīng)對(duì)象
終結(jié)請(qǐng)求-響應(yīng)循環(huán) [攔載器]
調(diào)用下一個(gè)中間件
4.中間件分類
應(yīng)用級(jí)中間件(*)
路由級(jí)中間件(*)
錯(cuò)誤處理中間件
內(nèi)置中間件
5.標(biāo)準(zhǔn)語(yǔ)法
app.use(url,(req,res,next)=>{
});
url:攔載地址(觸發(fā)地址)
req:請(qǐng)求對(duì)象
res:響應(yīng)對(duì)象
next:調(diào)用下一個(gè)中間件或路由
6.路由中間件
路由 = 請(qǐng)求方法+請(qǐng)求地址+處理函數(shù)
示例: app.get(“/list”,(req,res)=>{…})
語(yǔ)法
var router = express.Router(); //創(chuàng)建路由中間件對(duì)象 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)創(chuàng)建三個(gè)路由文件
router/userRouter.js 保存所有用戶功能
router/orderRouter.js 保存所有訂單功能
router/productRouter.js 保存所有產(chǎn)品功能
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
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94158.html
摘要:異步最佳實(shí)踐避免回調(diào)地獄前端掘金本文涵蓋了處理異步操作的一些工具和技術(shù)和異步函數(shù)。 Nodejs 連接各種數(shù)據(jù)庫(kù)集合例子 - 后端 - 掘金Cassandra Module: cassandra-driver Installation ... 編寫(xiě) Node.js Rest API 的 10 個(gè)最佳實(shí)踐 - 前端 - 掘金全文共 6953 字,讀完需 8 分鐘,速讀需 2 分鐘。翻譯自...
摘要:文本已收錄至我的倉(cāng)庫(kù),歡迎前后端分離這個(gè)詞相信大家都聽(tīng)過(guò),不知道大家是怎么理解的呢。流下不學(xué)無(wú)術(shù)的淚水目前我了解到的前后端分離,首先部署是分離的至少不會(huì)跟綁定在一起部署接口只返回?cái)?shù)據(jù)關(guān)于前端這幾大框架這幾個(gè)我都是沒(méi)有寫(xiě)過(guò)的,所以也就不多了。 前言 只有光頭才能變強(qiáng)。文本已收錄至我的GitHub倉(cāng)庫(kù),歡迎Star:https://github.com/ZhongFuCheng3y/3y ...
摘要:年終總結(jié)結(jié)果到這個(gè)時(shí)間才寫(xiě),其實(shí)也是無(wú)奈。這一年最重要的事情就是順利從一只學(xué)生狗轉(zhuǎn)職為一只社畜。四月份畢業(yè)之后以前端工程師的職位入職天貓,到現(xiàn)在也差不多工作一年了。 年終總結(jié)結(jié)果到這個(gè)時(shí)間才寫(xiě),其實(shí)也是無(wú)奈。本來(lái)計(jì)劃過(guò)年寫(xiě)的,沒(méi)想到Steam竟然開(kāi)了個(gè)農(nóng)歷春節(jié)特惠,然后就被各種游戲打了,辣雞平臺(tái),斂我錢(qián)財(cái),頹我精神,耗我青春,害我單身 以下全都是個(gè)人看法,如果有不認(rèn)同的地方,請(qǐng)大吼一聲...
摘要:年終總結(jié)結(jié)果到這個(gè)時(shí)間才寫(xiě),其實(shí)也是無(wú)奈。這一年最重要的事情就是順利從一只學(xué)生狗轉(zhuǎn)職為一只社畜。四月份畢業(yè)之后以前端工程師的職位入職天貓,到現(xiàn)在也差不多工作一年了。 年終總結(jié)結(jié)果到這個(gè)時(shí)間才寫(xiě),其實(shí)也是無(wú)奈。本來(lái)計(jì)劃過(guò)年寫(xiě)的,沒(méi)想到Steam竟然開(kāi)了個(gè)農(nóng)歷春節(jié)特惠,然后就被各種游戲打了,辣雞平臺(tái),斂我錢(qián)財(cái),頹我精神,耗我青春,害我單身 以下全都是個(gè)人看法,如果有不認(rèn)同的地方,請(qǐng)大吼一聲...
摘要:?jiǎn)栴}回答者黃軼,目前就職于公司擔(dān)任前端架構(gòu)師,曾就職于滴滴和百度,畢業(yè)于北京科技大學(xué)。最后附上鏈接問(wèn)題我目前是一名后端工程師,工作快五年了。 showImg(https://segmentfault.com/img/bVbuaiP?w=1240&h=620); 問(wèn)題回答者:黃軼,目前就職于 Zoom 公司擔(dān)任前端架構(gòu)師,曾就職于滴滴和百度,畢業(yè)于北京科技大學(xué)。 1. 前端開(kāi)發(fā) 問(wèn)題 大...
閱讀 3407·2023-04-26 02:41
閱讀 2454·2023-04-26 00:14
閱讀 2857·2021-08-11 10:22
閱讀 1284·2019-12-27 11:38
閱讀 3575·2019-08-29 18:34
閱讀 2384·2019-08-29 12:13
閱讀 2955·2019-08-26 18:26
閱讀 1853·2019-08-26 16:49