亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

Node.js入門指南:從JavaScript運行環(huán)境到后端服務開發(fā)基礎

Node.js入門指南:從JavaScript運行環(huán)境到后端服務開發(fā)基礎 1. 從瀏覽器到服務器JavaScript 開發(fā)者為什么要學 Node.js很多同學學完 JavaScript 基礎之后會陷入一個很常見的困惑JS 明明是在瀏覽器里跑的怎么突然又冒出來一個 Node.js它到底是不是一門新語言我要不要學學了能干嘛先直接把結論擺在這里Node.js 不是一門新語言它就是一個用 C 寫的 JavaScript 運行環(huán)境。瀏覽器能跑 JavaScript是因為瀏覽器內置了 V8 引擎來解析和執(zhí)行 JS 代碼Node.js 則是把 V8 引擎從瀏覽器里抽了出來裝進了一個獨立的程序里讓 JavaScript 脫離瀏覽器也能運行而且還能像 PHP、Java 一樣去寫后端服務。這套 JavaScript 基礎課程講到這里正是從純前端切入后端的關鍵節(jié)點。之前我們寫的所有 JS 代碼都是跑在瀏覽器里的操作的也是頁面上的 DOM、事件、Ajax。但從這一篇開始你會發(fā)現(xiàn)同樣的語法換一個運行環(huán)境就能去處理文件、連接數(shù)據(jù)庫、寫 HTTP 服務接口。我見過太多人卡在這個轉型節(jié)點上。有人覺得后端是另一套完全不同的知識體系心里發(fā)怵有人一上來就去背 Express 的 API結果遇到問題完全不知道從哪里排查。其實 Node.js 后端入門遠沒有想象中那么嚇人關鍵是先建立起一個完整的認知框架它是什么、為什么需要它、它和瀏覽器端 JS 到底有什么不同、它自己獨特的運行機制又是什么。這一篇我就按照我做全棧項目時帶新人的思路把 Node.js 后端基礎拆成幾個核心模塊來拆解。你不需要一次性記住所有 API但學完之后一定要能獨立從零搭建一個簡單的后端服務并且能理解它每一步在干什么。這篇內容適合基礎篇最后幾章在讀的人也適合已經(jīng)會寫前端但一直沒入門后端的同學參考。2. 環(huán)境準備Node.js 安裝與驗證2.1 安裝前先理解版本選擇不管是在 Windows、macOS 還是 Linux 上裝 Node.js本質上做的事情都一樣把 Node.js 運行時和 npm 包管理器裝到你電腦上。npm 是 Node.js 自帶的包管理工具后面裝 Express、axios 這些第三方庫全靠它。官網(wǎng)下載地址是 nodejs.org打開之后你會發(fā)現(xiàn)有兩個版本一個寫著 LTS一個寫著 Current。我給你的建議非常簡單粗暴永遠裝 LTS 版本。LTS 全稱 Long Term Support是長期維護版本生產(chǎn)環(huán)境中大家都在用穩(wěn)定性經(jīng)過了大盤驗證。Current 版本雖然會有一些新特性但迭代太快今天裝完可能過兩周就要升級對于學習和做項目來說完全沒必要追新。還有一個很多人會踩的坑去百度搜“node.js 下載”點進一些第三方下載站結果下載下來是一個被篡改過的安裝包輕則帶一堆捆綁軟件重則有人往里面塞惡意代碼。Node.js 的官方域名就是 nodejs.org認準這個就行盡量不要去第三方站點。2.2 Windows 上完整安裝步驟Windows 上安裝比較簡單下載 .msi 后綴的安裝包雙擊運行一路 Next。但有幾個地方要特別注意。安裝到選擇組件那一步時默認會勾選 “Add to PATH”這個必須保留。它的作用是把 Node.js 的可執(zhí)行文件路徑加進系統(tǒng)環(huán)境變量只有這樣才能在命令行里直接敲 node 命令。見過有人手滑把這步取消掉裝完以后在終端里怎么敲 node 都提示“不是內部或外部命令”。安裝路徑我建議不要裝在 C 盤默認路徑下尤其是你后面要裝很多全局包的時候。比如我會裝到 D:\nodejs這樣重裝系統(tǒng)或者清理空間時不會把環(huán)境一起帶走。當然如果你是初學者這一步也可以先默認路徑等后面熟悉了再遷移也不遲。安裝完成之后打開命令行工具Win R輸入 cmd回車輸入下面兩條命令驗證node -v npm -v如果分別輸出了 v20.x.x 和 10.x.x 這樣的版本號那就說明安裝成功了。注意 node -v 前面輸出的一定是 v 開頭如果報錯說找不到命令大概率是 PATH 沒配對重新裝一次把 Add to PATH 勾上就行。2.3 macOS 上的安裝差異macOS 上裝 Node.js 有兩種常規(guī)方式一種是像 Windows 一樣去官網(wǎng)下載 .pkg 安裝包雙擊安裝另外一種是用 Homebrew 命令安裝brew install node我個人更推薦用 Homebrew。原因很簡單后續(xù)升級方便一條 brew upgrade node 就能搞定不用重新去官網(wǎng)下載。而且 Homebrew 裝出來的目錄結構比較統(tǒng)一后面配合 nvmNode 版本管理器管理多版本也更順手。裝完之后同樣用 node -v 和 npm -v 驗證。如果在 macOS 上提示 command not found可能是你的終端會話沒有刷新環(huán)境變量關掉終端重新開一個或者執(zhí)行 source ~/.zshrc 再試一次。2.4 第一個 Hello World驗證運行環(huán)境安裝驗證通過之后我們來跑第一個 Node.js 程序。新建一個文件夾比如叫 node-basic在文件夾里新建一個文件 hello.js用任意編輯器VS Code 最好輸入下面代碼console.log(Hello, Node.js!);保存之后在命令行里先 cd 到這個文件夾然后執(zhí)行node hello.js如果終端輸出了 Hello, Node.js!恭喜你Node.js 環(huán)境已經(jīng)完全可用了。這一步雖然簡單但它確認了一件很重要的事情JavaScript 現(xiàn)在不僅能在瀏覽器里跑也能作為一個獨立程序在操作系統(tǒng)里直接運行了。3. 運行機制拆解Node.js 與瀏覽器端 JS 的核心差異3.1 全局對象完全不同在瀏覽器里我們寫 alert、document、window、localStorage 這些 API它們都是瀏覽器提供的。window 是全局對象下面掛著各種方法和屬性。但是在 Node.js 里沒有 window沒有 document也沒有 alert。Node.js 的全局對象是 global在較新版本中也可以使用 globalThis。同時 Node.js 提供了一些瀏覽器里沒有的全局對象最常用的就是 __dirname當前文件所在目錄的絕對路徑、__filename當前文件的絕對路徑還有 console 和 setTimeout、setInterval 這些。這一塊最典型的認知沖突是很多同學在剛接觸 Node.js 時下意識敲一個 alert(hello)結果直接報錯 ReferenceError: alert is not defined。原因很簡單——alert 是瀏覽器提供的彈窗 APINode.js 沒有界面自然也就沒有這個 API。你只需要記住一個核心原則Node.js 是服務端運行環(huán)境它提供的 API 主要是文件、網(wǎng)絡、進程相關的能力瀏覽器提供的 API 主要面向頁面交互和渲染。3.2 模塊化加載的差異瀏覽器中的 JavaScript在 ES6 出現(xiàn)之前都是通過多個 script 標簽引入共享全局作用域。這會導致一個典型問題變量污染。a.js 里定義了一個變量b.js 里可能就不小心把它覆蓋了。Node.js 天生就是模塊化的。每個 JS 文件就是一個獨立的模塊模塊內的變量默認是私有的外部訪問不到。想要暴露出去用 module.exports想要引入別的文件用 require。這是 CommonJS 規(guī)范Node.js 原生的模塊系統(tǒng)。舉個非常直觀的例子。我在 common.js 里定義兩個函數(shù)function add(a, b) { return a b; } function multiply(a, b) { return a * b; } module.exports { add, multiply };然后新建 index.js 引入它const common require(./common.js); console.log(common.add(2, 3)); // 5 console.log(common.multiply(2, 3)); // 6這個模式就非常像后端架構里常用的“分層”思路——文件之間職責分離互不干擾。這對于寫大型項目尤其重要?;叵胍幌略跒g覽器里寫原生 JS 的經(jīng)驗文件之間變量全暴露在全局一次不小心的重命名就能引發(fā)難以排查的 Bug。Node.js 的模塊機制從根源上把這個風險降到了零。3.3 事件循環(huán)Node.js 為什么“非阻塞”講到 Node.js 的機制事件循環(huán)是繞不開的概念。但我不打算展開講得太深初學者只需要掌握一個核心差異Node.js 的 I/O 操作默認是異步非阻塞的。什么叫 I/O簡單說就是讀文件、寫文件、網(wǎng)絡請求、數(shù)據(jù)庫查詢這些需要等待外部設備響應的操作。在同步的編程模型里代碼執(zhí)行到“讀文件”這一行時整個程序會卡住等文件讀取完畢再繼續(xù)往下走。這種模式在服務器場景下很致命如果同時有 100 個用戶請求但每個請求都要排隊等一個慢速的磁盤操作那 100 個用戶就得串行等待體驗極差。Node.js 的處理方式是事件驅動。它把耗時操作扔給底層線程池去處理自己則繼續(xù)往下執(zhí)行后面的代碼。等那個耗時操作完成了再通過事件回調來通知 JavaScript 層。這樣一來同一時刻可以同時發(fā)起多個 I/O 操作程序不會因為等待某個操作完成而阻塞??匆幌聦嶋H例子用 setTimeout 演示異步回調的執(zhí)行次序console.log(開始); setTimeout(() { console.log(定時器執(zhí)行); }, 0); console.log(結束);你可能以為“定時器執(zhí)行”會輸出在“結束”之后因為 setTimeout 延遲是 0 毫秒。但實際上輸出結果是開始 結束 定時器執(zhí)行原因就是 setTimeout 的回調函數(shù)不會立即執(zhí)行而是被放進了“宏任務隊列”等當前代碼執(zhí)行棧清空之后事件循環(huán)才會去取出它來執(zhí)行。這個現(xiàn)象在學習前端 JavaScript 時會遇到在后端開發(fā)里更是家常便飯。你寫代碼時必須徹底接受“回調不一定會按書寫順序執(zhí)行”這件事否則后面寫文件讀取、數(shù)據(jù)庫查詢時就會寫出各種隱藏 Bug。3.4 手動實現(xiàn)一個簡單的事件驅動機制為了讓你徹底理解事件驅動的思路我們不用任何黑科技純粹用 JavaScript 實現(xiàn)一個簡化版的事件發(fā)射器class SimpleEventEmitter { constructor() { this.events {}; } on(eventName, callback) { if (!this.events[eventName]) { this.events[eventName] []; } this.events[eventName].push(callback); } emit(eventName, data) { const callbacks this.events[eventName] || []; callbacks.forEach(callback callback(data)); } } const emitter new SimpleEventEmitter(); emitter.on(userLogin, (user) { console.log(${user.name} 登錄成功); }); emitter.emit(userLogin, { name: 張三 });這個代碼雖然簡單但它展示了 Node.js 中 EventEmitter 的核心思想先注冊事件對應的回調函數(shù)然后在某個時機觸發(fā)事件事件對應的所有回調依次執(zhí)行。理解了這段代碼后面你再看到 fs.readFile、http.createServer 這些 API 的回調函數(shù)就不會覺得它們是什么魔法了——它們都是把“做完事情后要做的事”作為回調傳了進去。4. 核心模塊實戰(zhàn)模塊系統(tǒng)與 npm 使用詳解4.1 文件操作模塊fs 玩轉讀寫fs 是 Node.js 內置的文件系統(tǒng)模塊做任何和后端相關的開發(fā)都離不開它。它同時提供了同步和異步兩套 API比如 readFileSync 和 readFile。初學者很容易被這兩套搞暈我建議你暫時把同步版本當作理解用的輔助實際寫代碼盡量用異步版本因為異步版本不會阻塞事件循環(huán)。先看同步讀取的寫法方便理解邏輯const fs require(fs); try { const data fs.readFileSync(./data.txt, utf8); console.log(data); } catch (err) { console.error(讀取文件失敗:, err.message); }這里有兩個細節(jié)值得注意。第一個是編碼參數(shù) utf8如果不傳fs.readFileSync 返回的是一個 Buffer 對象也就是二進制數(shù)據(jù)直接 console.log 會輸出一堆十六進制數(shù)字。第二個是 try-catch。同步方法一旦出錯會直接拋出異常所以必須用 try-catch 包住否則程序直接崩潰退出。再來看異步版本也就是實際開發(fā)中更常用的方式const fs require(fs); fs.readFile(./data.txt, utf8, (err, data) { if (err) { console.error(讀取文件失敗:, err.message); return; } console.log(data); });異步 API 的回調函數(shù)遵循 Node.js 的“錯誤優(yōu)先”約定第一個參數(shù)永遠是可能的錯誤對象第二參數(shù)才是正常數(shù)據(jù)。這是一種約定俗成的風格你會發(fā)現(xiàn) fs 模塊里幾乎所有異步 API 都是這樣設計的。寫回調時一定要先檢查 err 是否存在再處理數(shù)據(jù)這是寫 Node.js 代碼的基本素養(yǎng)。文件寫入也有同步和異步兩種。寫入文件更常用的是 fs.writeFileconst fs require(fs); const content 這是要寫入的內容; fs.writeFile(./output.txt, content, utf8, (err) { if (err) { console.error(寫入失敗:, err.message); return; } console.log(寫入成功); });需要注意writeFile 默認是覆蓋寫入會直接把文件原來的內容全部替換成新內容。如果你要做日志追加得用 fs.appendFileconst logLine new Date().toISOString() 用戶登錄\n; fs.appendFile(./log.txt, logLine, (err) { if (err) { console.error(追加失敗:, err.message); } });這一小段代碼對應了一個非常實際的后端場景日志收集。真實的后端服務里每個請求的記錄、錯誤信息的追蹤很多都是從這種簡單的 appendFile 開始的。4.2 路徑模塊path 處理跨平臺路徑問題path 模塊你可能覺得它不重要但實際上它幾乎是 fs 的固定搭檔。直接用字符串拼接路徑在 Windows 上用反斜杠 \在 macOS 和 Linux 上用正斜杠 /這就會導致同一個代碼在不同系統(tǒng)上行為不一致在 Windows 上正常在 Linux 上就報路徑找不到。path.join 的作用就是幫你把路徑片段拼成當前系統(tǒng)支持的正確格式const path require(path); const fullPath path.join(__dirname, data, user.json); console.log(fullPath); // Windows 輸出類似 D:\node-basic\data\user.json // macOS/Linux 輸出類似 /Users/xxx/node-basic/data/user.json另外一個很常用的方法是 path.resolve它會返回一個絕對路徑。和 path.join 的區(qū)別是resolve 會把相對路徑解析成相對于當前工作目錄的絕對路徑。還有一個 path.extname 可以取文件后綴名const path require(path); console.log(path.extname(index.html)); // .html console.log(path.extname(app.js)); // .js4.3 npm前端轉后端最容易忽略的一環(huán)剛開始用 Node.js 時很多人的疑問是別人代碼里的 express、axios、jsonwebtoken 這些庫是怎么來的答案就是通過 npm 安裝的。npm 的全稱是 Node Package Manager是 Node.js 自帶的包管理器。它的作用就相當于手機上的應用商店——想用什么庫一條命令就裝好還能自動處理依賴關系。最常用的幾個命令你只需要先記住這幾個npm init -y # 初始化項目生成 package.json 文件 npm install express # 在當前項目中安裝 express 包 npm install -g nodemon # 全局安裝 nodemon npm uninstall express # 卸載某個包npm install 裝完之后項目目錄下會多出兩個東西node_modules 文件夾和 package-lock.json 文件。node_modules 是第三方庫實際存放的位置package-lock.json 會鎖定每個依賴包的具體版本號保證團隊協(xié)作時大家裝到的版本完全一致。有一個新手很容易犯的錯誤把自己的 node_modules 目錄傳到了 Git 倉庫里。node_modules 體積巨大而且完全可以根據(jù) package.json 重新生成所以正常做法是在 .gitignore 里把 node_modules 排除掉。別人拿到你的代碼后只需要執(zhí)行 npm install就會自動按 package.json 的聲明把所有依賴裝回來。package.json 是 Node.js 項目的核心配置文件。一個最簡化的 package.json 長這樣{ name: node-basic, version: 1.0.0, description: , main: index.js, scripts: { start: node index.js, dev: nodemon index.js }, dependencies: { express: ^4.19.2 } }scripts 字段里可以自定義命令。npm start 對應 node index.jsnpm run dev 對應 nodemon index.js。nodemon 是一個監(jiān)聽文件變化自動重啟服務的工具本地開發(fā)時用它可以大幅提高效率改完代碼不用手動重啟服務它自動幫你重新運行。5. 從零搭建 HTTP 服務不用框架先搞懂原理5.1 使用原生 http 模塊創(chuàng)建服務器很多教程一上來就教 Express 框架導致很多人根本不知道 Express 底層是怎么工作的。遇到問題之后只能復制粘貼代碼完全沒有排查思路。所以這里我堅持先用 Node.js 原生 http 模塊寫一遍服務器讓你看清最底層的東西長什么樣。Node.js 內置了 http 模塊可以直接創(chuàng)建一個 HTTP 服務器。下面是實現(xiàn)一個最簡單的服務器訪問時返回 “Hello World”const http require(http); const server http.createServer((req, res) { res.writeHead(200, { Content-Type: text/plain; charsetutf-8 }); res.end(Hello World); }); server.listen(3000, () { console.log(服務器已啟動: http://localhost:3000); });在命令行執(zhí)行 node server.js然后打開瀏覽器輸入 http://localhost:3000你會在頁面上看到 “Hello World”。代碼雖然只有幾行但它把 HTTP 服務的核心要素全部包含了請求對象 req、響應對象 res、端口監(jiān)聽。這個例子里有一個非常關鍵的參數(shù)就是 Content-Type。它告訴瀏覽器響應內容的類型。如果不設置 charsetutf-8瀏覽器默認按其他編碼解析中文就會變成亂碼。這類問題在后端開發(fā)里極其常見平時開發(fā)接口時返回 JSON 數(shù)據(jù)必須設置 Content-Type 為 application/json; charsetutf-8這一點以后寫 Express 接口時同樣適用。5.2 處理路由與請求方法上面這個例子不管訪問哪個路徑返回的都是 Hello World。那真實的網(wǎng)站是怎么實現(xiàn)不同網(wǎng)址展示不同內容的呢答案就是根據(jù)請求的 URL 和請求方法分別處理。下面這個版本通過判斷 req.url 和 req.method將請求分發(fā)到不同的處理邏輯const http require(http); const server http.createServer((req, res) { const { url, method } req; res.setHeader(Content-Type, application/json; charsetutf-8); if (url / method GET) { res.end(JSON.stringify({ message: 歡迎訪問首頁 })); } else if (url /api/users method GET) { res.end(JSON.stringify({ users: [張三, 李四, 王五] })); } else if (url /api/users method POST) { let body ; req.on(data, (chunk) { body chunk.toString(); }); req.on(end, () { const parsedBody JSON.parse(body); res.end(JSON.stringify({ message: 創(chuàng)建用戶: ${parsedBody.name} })); }); } else { res.statusCode 404; res.end(JSON.stringify({ message: 接口不存在 })); } }); server.listen(3000, () { console.log(服務器已啟動: http://localhost:3000); });注意 POST 請求的處理方式。HTTP 請求體不是一次性全部到達的而是像流水一樣分塊到達的。Node.js 會觸發(fā) data 事件來接收每一塊數(shù)據(jù)最后觸發(fā) end 事件表示請求體接收完畢。所以代碼里用 let body 把每一塊數(shù)據(jù)拼接起來等到 end 事件時再整體解析。這一段代碼把一個簡單的路由分發(fā)邏輯模擬了出來。實際后端的路由處理就是這種思路的擴展但像路由匹配、參數(shù)解析、中間件機制這些事情如果全部自己寫代碼很快就會膨脹到無法維護。于是就有了 Express 這樣的 Web 框架把常見的底層邏輯都封裝好了。5.3 接口什么是接口為什么前端需要它關于“接口是啥”這個問題網(wǎng)上有很多繞來繞去的解釋我直接用大白話說一次。接口就是你用 HTTP 協(xié)議和后端服務通信的一組 URL 約定。前端向某個 URL 發(fā)一個請求后端返回一段數(shù)據(jù)就能讓頁面把數(shù)據(jù)展示出來。比如一個典型的前后端分離項目前端是一個 Vue 應用跑在 8080 端口后端是一個 Node.js 服務跑在 3000 端口。前端要在頁面上展示用戶列表只需要向后端請求 /api/users 這個接口后端返回 JSON 格式的數(shù)組前端拿到數(shù)據(jù)之后渲染成列表。從前端發(fā)請求最常用的方式是 fetch。注意這是個瀏覽器和 Node.js 都在不斷完善的 API尤其是較新版本的 Node.js 內置了全局 fetch所以前端基礎里學到的 fetch 技能可以直接遷移到 Node.js 中。舉個例子fetch(http://localhost:3000/api/users) .then(response response.json()) .then(data { console.log(data); }) .catch(err { console.error(請求失敗:, err); });前后端分離項目里的聯(lián)調本質上就是前端發(fā)請求后端返回數(shù)據(jù)兩邊約定好 URL 和 JSON 結構。這個“約定”就是接口。這也是為什么學習 Node.js 基礎時我們一定要自己動手創(chuàng)建 HTTP 服務——只有當你親手寫過接口、響應過請求、思考過返回狀態(tài)碼才能真正理解前后端協(xié)作是怎么一回事。6. 深入 Node.js 模塊機制CommonJS 與回調函數(shù)6.1 模塊導出與引入的幾種寫法前面已經(jīng)介紹了最基本的 module.exports 和 require。但實際項目里模塊導出會有幾種不同風格這里把常見的全部列出來你以后看到別人的代碼就不會發(fā)懵。第一種導出一個對象// utils.js const formatDate (date) date.toISOString().split(T)[0]; const addDays (date, days) { const result new Date(date); result.setDate(result.getDate() days); return result; }; module.exports { formatDate, addDays };第二種直接掛在 exports 上// math.js exports.add (a, b) a b; exports.subtract (a, b) a - b;這兩種寫法在功能上是等價的。但要特別注意一個坑exports 是 module.exports 的一個引用如果直接寫 exports xxx就相當于把 exports 指向了另一個對象而 module.exports 仍然指向原來的空對象最后引入的結果就是空對象。所以如果你要導出一個單獨函數(shù)或類必須用 module.exports而不是直接給 exports 賦值。最簡單的導出函數(shù)寫法// greet.js module.exports function(name) { return 你好, ${name}; };對應的引入方寫法const greet require(./greet.js); console.log(greet(小明)); // 你好, 小明6.2 回調地獄與初級解決方案Node.js 早期的異步操作完全靠回調函數(shù)串聯(lián)。代碼如果復雜起來很快就會變成“回調地獄”。我實際帶項目時見過不少這種代碼層層嵌套縮進越來越深邏輯越來越難看懂fs.readFile(./user.json, utf8, (err, userData) { if (err) { console.error(err); return; } const user JSON.parse(userData); fs.readFile(./order.json, utf8, (err, orderData) { if (err) { console.error(err); return; } const orders JSON.parse(orderData); // 繼續(xù)嵌套... }); });這種寫法的問題一目了然代碼可讀性差、錯誤處理重復、很難追蹤調用順序。解決回調地獄的現(xiàn)代方式是使用 Promise 和 async/await。Node.js 從 8.0 版本開始大規(guī)模支持 async/await現(xiàn)在幾乎已經(jīng)成為后端開發(fā)的標準寫法。比如同樣讀取文件用 fs.promises 加 async/await 就能寫得很清晰const fs require(fs).promises; async function loadData() { try { const userData await fs.readFile(./user.json, utf8); const orderData await fs.readFile(./order.json, utf8); const user JSON.parse(userData); const orders JSON.parse(orderData); console.log(user, orders); } catch (err) { console.error(讀取數(shù)據(jù)失敗:, err.message); } } loadData();async/await 并沒有發(fā)明新東西它就是 Promise 的語法糖。只要你理解了 Promise 的概念——一個尚未完成的異步操作的容器這個容器最終會變成成功狀態(tài)或失敗狀態(tài)async/await 就只是讓代碼看起來像同步寫法而本質上還是異步執(zhí)行。6.3 理解 Promise 的三種狀態(tài)Promise 的三種狀態(tài)是學習 Node.js 異步時繞不開的pending進行中、fulfilled已成功、rejected已失敗。狀態(tài)一旦從 pending 變成 fulfilled 或 rejected就不可再變化。這是理解異步代碼最重要的底層觀念。我給你看一個實際使用的例子。在真實項目中經(jīng)常需要封裝一個數(shù)據(jù)庫查詢函數(shù)返回 Promisefunction queryUserById(id) { return new Promise((resolve, reject) { // 模擬數(shù)據(jù)庫異步查詢 setTimeout(() { if (id 0) { reject(new Error(無效的用戶 ID)); return; } resolve({ id, name: 張三 }); }, 500); }); } async function getUser() { try { const user await queryUserById(1); console.log(查詢成功:, user); } catch (err) { console.error(查詢失敗:, err.message); } } getUser();Promise 內部的 resolve 和 reject 就是狀態(tài)切換的開關。resolve 表示成功reject 表示失敗。async 函數(shù)里的 await 會暫停執(zhí)行直到 Promise 狀態(tài)確定為止但暫停期間并不會阻塞其他代碼執(zhí)行——這就是非阻塞異步和同步代碼最大的區(qū)別。7. 從原生到 Express快速搭建可用后端項目7.1 為什么需要框架前面我們用原生 http 模塊寫了一個很基礎的服務。真實項目里如果每個接口都像那樣手動判斷 url、method再手動拼接請求體代碼很快就會膨脹到?jīng)]法維護。輪子已經(jīng)有人造好了而且非常成熟沒必要自己重新造。Express 是目前 Node.js 生態(tài)里使用最廣泛的 Web 框架。它做的事情概括起來就是把路由分發(fā)、參數(shù)解析、中間件機制、靜態(tài)文件服務這些通用能力封裝好讓你專注于寫業(yè)務邏輯。加上 Express 中間件的設計非常靈活通過 use 方法可以方便地掛載各種功能模塊。插一句現(xiàn)在也有很多人直接用 Koa 或 Fastify、NestJS 這些新框架。但作為新手初期的核心目標不是“用最新最潮的框架”而是理解一個 Web 框架最基礎的長什么樣。Express 的文檔、中間件生態(tài)、學習資料都是最全的用它入門是最穩(wěn)的路徑。7.2 用 Express 重寫剛才的服務先安裝依賴npm init -y npm install express然后創(chuàng)建一個 app.jsconst express require(express); const app express(); app.use(express.json()); app.get(/, (req, res) { res.json({ message: 歡迎訪問首頁 }); }); app.get(/api/users, (req, res) { res.json({ users: [張三, 李四, 王五] }); }); app.post(/api/users, (req, res) { const { name } req.body; res.json({ message: 創(chuàng)建用戶: ${name} }); }); app.listen(3000, () { console.log(服務器已啟動: http://localhost:3000); });對比一下原生 http 模塊的代碼Express 版本的簡潔程度不是一點點。res.json() 直接返回 JSON 并自動設置 Content-Typereq.body 直接拿到了解析好的請求體數(shù)據(jù)路由定義只需要寫 HTTP 方法加路徑。這里有一行代碼極其重要app.use(express.json())。它的作用是給請求對象加一個 body 解析能力。如果沒有這一行Express 不會主動解析請求體req.body 就會是 undefined。很多新手遇到“POST 請求為什么拿不到參數(shù)”的問題九成都是因為忘寫這一行。7.3 Express 靜態(tài)資源托管一天學會Express 還能直接托管靜態(tài)文件。比如你的前端頁面打包之后全部放在 public 目錄只需要一行代碼就能讓瀏覽器直接訪問里面的 HTML、CSS、JS 和圖片const express require(express); const app express(); const path require(path); app.use(express.static(path.join(__dirname, public))); app.listen(3000, () { console.log(靜態(tài)資源服務器已啟動: http://localhost:3000); });在項目目錄下建一個 public 文件夾里面放一個 index.html瀏覽器打開 http://localhost:3000/index.html 就能直接看到頁面內容。這就是最原始的“前后端部署”場景——把前后端放在同一個服務下用同一個端口對外提供服務。實際的前后端分離部署會比這個復雜比如把靜態(tài)文件放在 Nginx后端服務獨立跑在某個端口再用 Nginx 做反向代理。但邏輯上本質都是一樣的靜態(tài)資源給瀏覽器接口給前端應用調。理解了 Express 的靜態(tài)托管你對部署就有了一個基礎概念。7.4 Express 中間件機制通俗解釋中間件是 Express 中一個非常重要的概念。用大白話說中間件就是“請求到達路由之前要經(jīng)過的一系列處理函數(shù)”。每一個中間件都能訪問請求對象和響應對象可以修改它們也可以決定是直接響應還是調用 next() 把控制權交給下一個中間件。下面是一個日志中間件的例子app.use((req, res, next) { console.log(${req.method} ${req.url} - ${new Date().toISOString()}); next(); });永遠記得調用 next()。如果這個中間件不調用 next()請求就會卡在這里永遠不會有響應。這是初學者最常犯的錯誤。還有常見的身份驗證中間件function authMiddleware(req, res, next) { const token req.headers[authorization]; if (!token) { res.status(401).json({ message: 未登錄無訪問權限 }); return; } // 這里可以校驗 token簡單示例略過 req.userId 12345; next(); } app.get(/api/profile, authMiddleware, (req, res) { res.json({ userId: req.userId, name: 張三 }); });這種寫法就是后端接口鑒權的基礎模型在真實的項目中如 JWT token 驗證、權限判斷、日志記錄全部都是通過中間件實現(xiàn)的。理解了中間件你就差不多摸到了 Express 的精髓。8. 前后端配合與接口調試fetch 與跨域處理8.1 前后端分離項目中的數(shù)據(jù)交互前面說過前后端分離是現(xiàn)代 Web 開發(fā)的常見模式。前端是一個獨立項目運行在某個端口或域名下后端是另一個獨立項目提供 API 接口。頁面加載后由前端通過 AJAX 或 fetch 向接口取數(shù)據(jù)再渲染。一個最簡單的前端頁面用 fetch 調用后端接口!DOCTYPE html html langzh-CN head meta charsetUTF-8 / title用戶列表/title /head body div idapp加載中.../div script fetch(http://localhost:3000/api/users) .then(response response.json()) .then(data { const appDiv document.getElementById(app); const userList data.users.map(user li${user}/li).join(); appDiv.innerHTML ul${userList}/ul; }) .catch(error { document.getElementById(app).textContent 請求失敗請檢查后端服務; console.error(error); }); /script /body /html打開前端頁面頁面會向后端發(fā)送請求拿回用戶列表渲染出來。這是前后端分離項目里前端最基本的交互邏輯。知道這點之后再去理解 Vue、React 里的數(shù)據(jù)請求本質上還是同一件事只是在框架中封裝成了更優(yōu)雅的寫法。8.2 跨域問題前端后端最難纏的坑前后端分離開發(fā)時前端跑在 5500 端口或者用 VS Code 的 Live Server 自動分配的端口后端跑在 3000 端口。瀏覽器的同源策略會攔截這兩個不同端口之間的請求。前端頁面里 fetch 一個不同源的后端接口控制臺就會報錯Access to fetch at http://localhost:3000/api/users from origin http://localhost:5500 has been blocked by CORS policy解決這個問題的最直接方法是后端在響應頭里主動聲明允許跨域訪問。不需要找什么復雜工具在 Express 里加一段中間件就能搞定app.use((req, res, next) { res.setHeader(Access-Control-Allow-Origin, *); res.setHeader(Access-Control-Allow-Methods, GET, POST, PUT, DELETE, OPTIONS); res.setHeader(Access-Control-Allow-Headers, Content-Type, Authorization); next(); });Access-Control-Allow-Origin 如果設置為 *表示允許任意域名訪問。生產(chǎn)環(huán)境一般不建議這樣放開更好的做法是指定具體的前端域名。但開發(fā)階段為了圖省事寫 * 是最常見的方式。如果不想在代碼里手寫這些響應頭也可以使用 npm 上現(xiàn)成的中間件 corsnpm install cors然后一行代碼掛載const cors require(cors); app.use(cors());這里我想強調的是跨域問題不是后端代碼邏輯錯誤而是瀏覽器安全策略。前端和后端代碼本身都沒有問題只是瀏覽器默認不允許跨源訪問。理解了這一點你看到這個報錯時就不會慌。8.3 常見運行時報錯排查思路后端開發(fā)中運行時報錯是每天都要面對的。Node.js 的報錯信息比較直白但還是有幾個常見的“新手專屬坑”我列出來你可以提前避雷。第一個是端口被占用。啟動服務時報錯Error: listen EADDRINUSE: address already in use :::3000原因是 3000 端口已經(jīng)被另一個進程占用了。常見解決辦法要么換一個端口比如 app.listen(3001)要么找到占用端口的進程把它結束掉。Windows 下查看并結束端口占用netstat -ano | findstr :3000 # 假設最后一列是 PID 12345執(zhí)行下面命令結束進程 taskkill /PID 12345 /FmacOS/Linux 下lsof -i :3000 kill -9 PID第二個是找不到模塊。報錯比如Cannot find module express這個問題幾乎都是因為在錯誤的目錄下執(zhí)行了 node 命令或者項目根本沒有執(zhí)行過 npm install。檢查一下當前目錄有沒有 node_modules 文件夾沒有就執(zhí)行 npm install。第三個是 JSON 解析失敗Unexpected end of JSON input這種情況通常是請求體不是合法的 JSON 格式。比如前端傳了一個空字符串或者 JSON 字符串里出現(xiàn)了多余逗號。排查思路是先用 console.log 把 body 打印出來看看實際接收到的是什么內容再對照 JSON 格式檢查。8.4 驗證調試接口的趁手工具開發(fā)接口時直接在瀏覽器里訪問 GET 接口很方便但 POST、PUT、DELETE 這些帶請求體的方法瀏覽器地址欄里沒法直接試。這里推薦兩個工具。第一個是 Postman功能最全面適合復雜調試場景從簡單的 GET 到帶 Token 的鑒權請求都能支持。第二個是 Apifox國內團隊用得很多接口文檔管理和測試一體。還有更輕量的方案是 VS Code 里的 Thunder Client 插件界面簡潔不用單獨開一個軟件。我個人的習慣是平時寫代碼直接瀏覽器加 console.log 做快速驗證聯(lián)調和測試接口時用 Postman 或者 Apifox。配置一個 POST 請求時需要在 Headers 里加 Content-Type: application/json然后在 Body 里選擇 raw貼一段 JSON點擊 Send 就能看到后端返回的結果。這一套接口驗證流程是前后端聯(lián)調的基本功。你把接口調試熟練了后面配合 Vue 或者 React 做項目時會非常省心。9. 部署起步本地服務如何跑起來9.1 常見部署思路你本地寫完的后端項目最終要部署到一臺服務器上才能讓其他人通過公網(wǎng)訪問。這一塊對于剛學完基礎的同學可以先不深入但要有一個概念。最常見最省事的方案是在服務器上安裝 Node.js 環(huán)境把代碼上傳上去npm install 安裝依賴然后啟動服務。注意生產(chǎn)環(huán)境啟動時要設置環(huán)境變量為 production并用像 PM2 這樣的進程管理工具來守護服務讓它在崩潰后自動重啟。一個簡化版本的部署流程是服務器上先安裝 Node.js推薦用 nvm 或者直接二進制包把項目代碼上傳到服務器cd 到項目目錄執(zhí)行 npm install --production啟動服務node app.js 或者使用 PM2pm2 start app.js如果有域名配置一下 Nginx 反向代理把某個域名指向你的服務端口這一步涉及的知識覆蓋了 Linux 命令、Nginx 配置、防火墻規(guī)則等等剛入門時不要求全部掌握但“后端項目是怎么跑起來的”這條鏈路一定要清楚。9.2 本地開發(fā)輔助nodemon 提升效率最后再分享一個非常實用的本地開發(fā)小技巧。你寫代碼時每改一次代碼就要手動 Ctrl C 終止服務再重新啟動重復幾十次下來效率很低。安裝 nodemon 之后它會監(jiān)聽項目文件的改動自動幫你重啟服務npm install -g nodemon啟動方式nodemon app.js之后你每次保存代碼控制臺會自動顯示服務重啟日志。唯一的坑是nodemon 會忽略 node_modules 目錄的變動不會因為裝了一個新包就重啟服務。如果你改了路由、改了業(yè)務代碼它都會自動重啟本地開發(fā)效率是這個提升很明顯。package.json 里建議這樣配置 scriptsscripts: { dev: nodemon app.js, start: node app.js }這樣 npm run dev 就是開發(fā)模式npm start 就是生產(chǎn)模式的啟動命令。10. 個人實操心得三個學習坑位與建議到這里Node.js 后端基礎的核心骨架已經(jīng)全部過了一遍。最后用我自己的經(jīng)驗說幾件事。第一一定要“動手敲不要只看”。Node.js 基礎階段的知識點互動性很強讀文件、寫服務器、調接口每一步都需要親手運行看到結果。看十遍教程不如自己在終端里跑一個服務器再手動用瀏覽器訪問一次。第二建議準備一個專門用來“折騰”的目錄把課程里所有例子都從零敲一遍尤其是 fs、http、Express 這部分。不要直接復制粘貼自己一個字一個字打出來。這樣寫出來的錯誤都是你自己的會有更深刻的記憶。踩過坑的知識點后面基本不會再犯同樣的錯。第三學完 Node.js 基礎后下一步怎么走我建議優(yōu)先完成三個方向一是深入 Promise 和 async/await把異步編程練熟這是后端開發(fā)最大的一道門檻二是選擇一個數(shù)據(jù)庫MongoDB 或者 MySQL 都可以學習增刪改查和 Node.js 如何操作數(shù)據(jù)庫三是嘗試做一個完整的增刪改查接口比如一個簡單的待辦事項列表用 Express 加一個數(shù)據(jù)庫實現(xiàn)這是每個后端工程師入門的第一個實戰(zhàn)項目。從我?guī)н^的新人來看能把這三步走完基本上就具備獨立開發(fā)一個小型后端服務的能力了。下一步再去接觸 NestJS、微服務、數(shù)據(jù)庫設計、部署運維這些內容就會順暢很多。Node.js 后端基礎這門課是你的第一塊跳板跳上去之后能走多高就看你想做哪個方向了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日日爱99| 麻豆天美国美国产| 久久久一区二区三区麻豆| 亚洲国产日韩欧美熟妇在线| 麻豆视频国产一区二区| 午夜综合在线| 亚洲夜色在线| AV免费在线播放一区| 99热在线播放| 久久久精品一区二区| 去干网最新版| 久久久久久久久久久免费精品| 96国产污污污丝袜| 亚洲日本成人动漫| 人妻日日夜夜精品| 国产激情综合| 风流老熟女一区二区三区l| 人人操人人精品影片| 天天肏美女| 精品亚洲国产成人精品| 中文字幕精品资源在线| 中文字幕乱在线伦视频中文字幕乱码在线 | 亚洲中文一区二区三区| 欧美色视频在线| 国产精品乱码久久| 欧美后入式| 欧美国产视频| 人夜夜精品网站香蕉嫩草| 黄色片A级一区二区三区| 亚洲阿v天堂无码z2018| 不卡在线观看视频| 色香综合| 欧美性91| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 曰韩少妇无码| 天天操妹子| 超碰久在线天天做| 超碰 国产熟女精品一区| 色诱avtt| 色噜噜人妻丝袜AV资源| 中文字幕视频2区| 午夜精品探花| 国产吞精a级片激情电影| 天天躁日日躁狠狠躁| 男人天堂2019| 一级一性爱免费视频| 神马麻豆福利院| 大香蕉92| 一二三区视频在线观看| 清纯唯美亚洲另类| 久久精品导航| 国产60页| 国产午夜福利电影免费在线观看| 天天做天天爱夜夜爽毛片试看| 国产无码成人无码| 可以在线观看的黄色网址| 成人免费性爱视视| 黄色AAAAAAAAAAA大片| 欧美性爱免费短视频| 午夜人人操| 国产亚洲精品A在线观看下载| 成 人 A V免费视频在线观看| 国产400孕妇孕交群| 校园春色五月天| 中文字幕三四区| 神马久久午夜| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 欧美国产日韩高清在线| 久久综合99| 26uuu国产成人综合| 日本污ww视频网站| 91亚·色| 欧美色图 人妻| 亚洲精品人伦一区二区| 国产色产精品在线观看| 少妇3P性爱自拍| 国产一区二区三区导航| 亚洲性综合9| 黑丝少妇麻豆| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 亚洲精品电影| 亚洲婷婷综合网| 午夜福利视频在线一区| 天天日天天舔东京热| 国产乱人妻精品入口| 91在线丝袜| 亚洲天天更新| 日韩成人大片在线观看| 香蕉一区二区三区在线视频| 男人的天堂久久狠| 亚洲全色网| 无码最新| 激情露脸爱| juliaann精品熟女一区| 十八禁电影伊人网| 国产怡红院| 乱伦日本色图AⅤ| 99成人| 夜夜骑操视频| 日韩av电影成人在线| www色婷婷| 国模不卡一本二本三电影| 色偷偷综合91久久噜噜| JIZZJIZZ国产精品喷水| 99啪啪| 精品久久久久久久| 5月婷婷6月六月丁香| 色噜噜国产在线| 99色在线| 欧美极品性爱天天射| 色综合99| 久久久成人免费av电影| 自拍偷拍国产欧美日韩韩| 亚洲成av人片色午夜乱码| 久插综合| 91国产操逼视频| 亚洲午夜福利视频| 日日干夜夜骑| 能在线播放的国产三级| 亚洲黄日韩无码专区| 91久| 岛国AV一区二区电影| 欧美午夜视频| 老熟女乱子伦中文字幕一区二区| 国产农村妇女精品一二区| 少妇色欲综合网2| 国内精品久久人妻性色av| 久操黄色视频| 搡老女人老91二区| 日韩AV电影网站| 色综合V| 日本美女性生活久久久久久久| 91黄射| 日韩另类| 欧美午夜熟妇黑人精品91| 中国女人内射6XXXXX| 国产夫妻一区二区| 国产第12页| 日本人妻一区二区| 在线观看亚洲成人精品| 欧洲一区二区三区免费| 密乳无码| 亚洲综合20p| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 欧美亚州色的图| 欧美不卡在线一区二区| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 婷婷五月天色网| 91天堂色男人的天堂| 亚洲图片视频小说| 欧美强奸一区二区诱惑| 男同专区一区二区三区在线| 五月丁香色婷婷| 啊啊啊啊网站| 玖玖综合色| 精品国产丝袜一区二区三区乱码| 精品一区二区三区蜜桃臀www| 色狠狠 - 百度| 亚洲成人帖图| 无码一区二区三区四区五区六区七区八区九区十区视频 | 亚洲精品国产无码高清| 精品人妻一区二区乱码一区二区| 欧美人妻精品一区二区| 三级色影综合网| 免费黄色A片| 熟妇人妻精品一区二区| 草伊人高潮喷水超碰| 蜜乳AV.COM| 制服诱惑亚洲一区二区三区在线观看| 欧美色日| 国产成人亚洲精品自产在线| 91香蕉视频在线观看免费| 国产女人9999| 丝袜内射| 五月天开心网| 免费簧片在线观看| 亚洲国产熟妇综合色专区| 黄网站黄视频网站进入口| 最近2019中文字幕国语免费版| 亚洲极品| 亚洲色香| 中出91| 黄色AAAAAAAAAAA大片| 熟妇人妻一二三区免费| 欧美少妇第一页| 久久av成人无码免费| 熟女少妇视频| 欧美一区二区三区成人性生活| 国产 日韩 欧美 人妻 熟女 中文| 秋霞网—男女啪啪亚洲免费体验区 | 中文字幕天天操| 新版天堂中文资源8在线| 女生91网站| 2026国产精品视频| 97 亚洲 日韩 欧美 在线| 日韩激情啪啪| 国产欧美日韩一区二区三区| 亚洲无992tv| 精品乱码在线观看| 久久久久久久久久久999| 97午夜剧场日韩| 久久久久国产一区二| 成人小说视频在线精品欧美| 蜜臀中文字幕| 爱丝福利| 偷拍五区| 色拍偷亚洲| 九X超碰| 婷婷伊人一区| 中文字幕在线观看第二页| 欧美亚洲中文| 白丝1区2区3区| 欧美性区| 九九热超碰97亚洲最新香蕉| 另类小说五月天| 色婷婷九月天天综合| 91综合色噜噜| 亚洲欧美小说| 激情一区二区| 最新岛国大片| 97免费在线观看| 久9爱精品| 日本三级韩国三级美三级91| 97精品国产手机| 色诱中文字幕| 亚洲天堂人人妻| m欧洲一级午老| 婷婷三区| 国产一区二区三区,在线观看观看| 超碰天天操| 亚洲棕合电彰| 免费精品AB| 亚洲伊人青青草| 91碰碰| 果冻传媒一区二区三区| 欧美97日韩精品| 色天堂综合| 九热大香蕉| 久久婷婷亚洲欧| ai欧美亚洲小说| 久久99999| 日本欧美色| 操国产高清| 日韩欧美加勒比| 性天堂| 欧美性爱日韩高清| 人人操人人摸人人看人人干| AV无码久久久精品| 女同在线视频一区| 夜夜操二区| 中文字幕版| 大屁股国产在线视频| 激情久久日韩精品中文字幕麻豆| 国产传媒一区二区三区| 免费精品人妻一区二区三| 国产乱码精品一区二区三区四川| 亚洲欧美激情在线视频| 亚洲天堂性爱| 日韩欧美天堂| 免费观看成人www精品视频| 国产亚洲精品无码三区| 少妇二级| 久久久一区二区| 亚洲黄色AV电影| 亚洲精品一二牛牛| 五月丁香婷婷啪啪| 91N综合网在线| 大鸡巴久久| A级在线视频| 日本丝袜人妻内射| 欧美综合加勒比在线| 色综合20p| 91五十路| 色五月综合网| 91美女看B| 久热最新在线杭州| 亚洲精品性爱片| 亚洲AV免费在线| 麻豆精品A片免费观看| 亚洲欧美内射| 三级精品三级在线观看| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 亚洲欧美在线丝袜| PMv在线观看| 不卡免费av在线播放| 亚洲欧美国产中文字幕| 嗯嗯啊好爽| 3p国产色噜噜一区| 超碰在线97国产| 放黄片放3级黄片没穿衣服| 一级性爱aaaa| www.AV有限公司一区| 1240青青草一区二区三区视频天爱| 郑州宾馆老熟女露脸啪啪| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 亚洲色人妻综合| 欧美激情 亚洲色图| 国产日韩欧美中文在线播放| 三级片大波波| 国产精品美女久久久久久网站| 成人性爱高清视频免费看| 四季AV综合网址| 精品人妻一区二区三区在| 亚洲久热| 春色综合网| 欧美黄色大香蕉一区二区| 99热国产精品| 亚洲色图殴美色图激情乱伦| 亚洲欧美天| 破苞ⅩXXX性无码动漫无码| 亚州综合AⅤ| av一区二区三区不卡| 99国内精品| 97欧美日韩| 一区二区偷拍拍视频| 国产精品伦理| 97超级久久强资源| 国产精品午夜福利亚洲综合网| 97中文天堂| 97超碰日韩| 午夜人妻精品综合在线| 亚洲丝袜诱惑| 欧美少妇高潮视频| 欧美在线播放aaaa| 99re在线| 密臀AV在线| 老司机射| 久夜视频| 青青操在线亚洲视频观看欧美在线| 欧美不卡在线一区二区| 日韩不卡一二三四| 爱我干综合| 国产一区在线看| 久久久久成人亚洲国产| 天天欲望网| 亚 欧 美 综合| 麻豆国产精品午夜视频| 91久久国外网| 五月天婷婷基地| 日本精品一区二区不卡| 东北黄色电影| www.色婷婷色综合| 久久久久九九九九| 亚洲污污网站| 日本 欧美 亚中文字幕| 国语国产操逼伊人AV网| 人人妻人人爱人人玩| 美女的肌被草喷水视频| 无码抄逼网| 999久久久九九九九| 超碰碰97| 国产少妇肉丝在线观看| 中文字幕一区二区三区字幕| 精品国产乱码久久久兰草影视| 人人操人人搞人人草| 超碰偷拍| 国产精品丝袜久久亚洲不卡| 婷婷三区| 在线播放中文字幕| ,成人免费啪啪视频| 青青草原成人| 久插综合| 嗯嗯啊在线视频| 99国产在线 精品 视频| 91色图| 一区二区亚州激情久婷婷欧美| 91亚州日韩高清| 欧美另类综合久久| 久久精品人人做人人看| 91天堂网| 91色综合| 91亚洲影视| 亚洲极品| 搡老女人老91妇女熟女| 试看福利| 亚洲av热热色| 91丝袜美腿网站| 亚洲欧美中文日韩视频中国语| 日本成人A片免费看| 清纯唯美亚洲综合| 大香蕉人妻久久| 大屁股熟女一区二区三区| 一区,二区,三区网站| 婷婷尹人大香蕉免费| 香蕉黄色一级视频| www久久国产精品| 欧美资源| 蜜桃狠狠色伊人亚洲综合网站| 粉嫩av一区二区三区四季| 国产AV天美| 精品射1999| 中文字幕一区av| 九月婷婷久久| 日本岛国黄色网址| 久久激情综合| 人妻夜夜爽天天爽麻豆三区网站 | 97日韩欧美亚洲| 午夜欧美J进J出白浆流出久久久 | 国产成人资源| 青青操97| a人欧美综合天堂麻豆| 台湾佬激情综合| 六月丁香网| 色综合99| 中亚av| 日本三级日本三级三级人妇四虎| 久久9亚洲| 日本熟妇熟色97一本在线观看| 97亚洲综合电影| 亚洲nv男人的天堂网| 五月天色图影视| 长长久久88视频| 资源在线观一 二| 色五月婷婷麻豆在| 青青草自拍视频在线播放| 婷婷综合在线观看| 欧美精品 - 91爱爱| 伊人991| 后入式五六区| 亚洲综合91| 亚洲AV秘无码一区..| 午夜超爽| 亚洲限制级| 综合视频91| 密臀成人视频久久久| 国产精品一区二区三区四区五区| 97在线免费| 国产成年女人免费视频播放a| 国产一级不卡在线观看| 国产丝袜视频| 97精品视频免费| 久久久久久久久久久久欧美日| 大香蕉一人| 成·人免费午夜在线观看| 黄视频免费| 天天干人妇| 亚洲欲色9532548967一区| 美女诱惑在线一区| 亚洲欧美97√| 亚洲免费在线探花| 91大胆欧美| 久久日本熟女精品一区| 亚洲同性aV综合| 亚洲无无码αⅴ每日更新| 黄色av一区二区在线| 九九精品美女高溯喷水| 免看60秒涩涩视频| 亚洲精品自拍| 五月丁香| 亚洲性猛| CCYY草草影院地址入口| 丁香六月婷婷久久综合| 欧美国产有色电影| yiqicaoav| 久久伊人五月天| 中文字幕综合人妻| 无码137片内射在线影院| 伊人久久大香大香线蕉中文 | 99re久久| 亚欧美综合网。| 91色狼| 自慰白浆在线观看| 无码男人天堂| 久草午夜| 日产狠狠干| 蜜桃臀AV在线| 国产A v无码专区| 久久婷婷在线观看视频| 日本综合色图| 九九这里只有精品| 97中文综合| 欧美亚洲| 久久一本大香蕉| 一区二区精品日韩欧美在线观看| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 天天综合欧美综合| 日韩啊V| 欧美制服网站美腿丝袜| 欧美写真视频一区| 久久久久久国产精品| 亚洲精品黑丝| 日韩性爱视频免费在线| 亚洲91射| av资源在线播放天堂| 午夜精品久久久久久久99| 伊人久久综合影院| 久久人妻无码毛片A片麻豆| 强奸乱伦免费网站| 天天综合,91综合永久| 91N综合网| 蜜乳AV色欲AVAV无码| 91国产伊人大香蕉| 丁香五月av| 精精品人妻一区二区三区| 激情五月综合网| 这里都是精品| 色播五月婷婷| 日韩免费a级毛片无码a∨| 欧美黄页在线| 久久精品国产亚洲5555| 日韩素人无码一区二区三区三州| 后入式免费视频| 色一射色一射| 人人看人人爰人人操| 天天舔天天日天天射| 91爆操视频| 超碰久草| 偷拍 精品 另类 四区| 亚洲人妻中文在线视频| av天天在线| 91人妻Pr| 少妇熟女1区2区3区| 亚洲 欧美 另类 日韩 人妻一区| 日韩欧美午夜视频在线| 蜜臀99久久国产| 欧美日韩情色一区二区| 亚一综合久久久久久久久久| 黑人精品欧美一区二区蜜桃| 久久久久久久久久久久久9999| 2019精品国产无码成人| 香蕉国产97| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 久久99999| 亚洲激情在线一区二区| 九九九九九九视频免费| 欧美 亚洲 91| 国产精品情侣啪啪| 久久超碰久| a片 xxxx受爽视频| 黄久在线| 99热精品国产| 黄片www.| 欧美偷拍区| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 色色色色日本| 日韩欧美加勒比| 台湾佬中文娱乐网久久久久久久久久com | 91日产欧美| 日韩人妻精品久久久久| 欧美亚洲尤物久久| 精品国产av一区二区三区四区入口| 欧美激情亚洲情色| 中文字幕在线观看第二页| 性爱乱伦一区| 国产精品亚洲无码| 一中国女人毛片水真多| 91老司机精品| 性色高清..……| 97精品国产97久久久久久户外免费| 免费啪啪一级视频| 亚欧免费| 亚洲成人精品在线一区| 久久专区| 天天综合网在线观看| 天天热精品| 欧美一区二区成人一卡| 欧美色66| 嫩草 人人网精品| 美女露胸露屁股| 五月丁香| 亚洲午夜av| 在线观看精品国产免费| 综合久久久久久久综合网| 久久精品国产亚洲AV先锋| 亚洲色婷婷综合久久久久中文| 精品国产污一区二区三区| 超碰在线99| 色婷视频| 亚洲五月丁香花狠狠干一区二区三区 | 日韩欧美操逼xxx| 日韩性爱啪啪视频| 久久久久久久人妻丝袜| 5252色欧美在线男人的天堂| 夜夜国自区| 91男同| 久热99999| 色色99| 久久曰曰| 美女毛片999| 日韩ab网| 日韩人妻丝袜美腿中文| 羞答答AV中文字| 丝袜加勒比| 日本大香蕉综合网红本杳社区 | www.91逼逼.com| 91精品国产日韩欧美综合| 乱伦av麻豆| 免费强奸av| 凹凸视频特色日本特黄| www.色婷婷| 日韩精品区二区三区不卡| 嗯嗯啊中文字幕| 嗯嗯,啊啊,国产精品| 殴美日韩m| 欧美97视频| 一区二区三区四区五区久久久久久| 夜夜嗨一区二区三区三州加勒比| 婷婷10月天青娱乐| 极品销魂美女一区二区 | 美女诱惑一区| 夜夜天天噜狠狠爱2021| 国模吧 一区二区三区| 开心激情婷婷| 精品国产99| 久久久久人| 欧美九九九九九| 久久精品久久久久久久久| 久久黄色性爱视频| 欧美视频一区二区在线| 久久极品一区二区| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 国模不卡一本二本三电影| 涩涩久久精品| 大色综合| 欧美性爱一级操| 欧美精品1区2区3区| 超碰79人人乐| 五月天亚洲网| 日本操逼视频在线| 国产a级午夜毛片| 97视频网站在线观看| 嫩草影院永久在线制服丝袜| 色约约一区=区三区| ji熟女.com| 在线 制服丝袜中出 人妻| www.AV有限公司一区| 久久精品国产97欧美精品亚洲| 欧美一级A一级a爱片久久| 大香蕉一线视频| 一本道综合色图| 中文字幕日产av人| 久久久久幕乱码| 国产精品久久久久久久久AV大片| 夜夜 中文视频rt| 精品一区二区3区| 蜜臀99999| 在线国产一区二区av| 2019午夜福利视频| 亚洲精品国产无码高清| 精品亚洲俞拍视频一区| 久久六六| 欧美在线|亚洲| 欧美黑人猛交春色影视大全| 99天天超碰| 一本色道综合久久欧美日韩精品| 97国产超湿| 亚洲精品电影| 丝袜综合| 国产精品久久久亚洲一区| 天堂亚洲精品| 亚洲视频一二区| 亚洲图片 91| 日本韩欧美在线播放a| 久久久一区二区三区三州| 欧美97av| 日本2020一区二区| 日本新免费二区三区| 久久久99久9| 韩国三级理论在线| 日韩精品中文字幕一| 久久精品国产亚洲AV清纯| 欧洲一区二区三区四区在线观看| 久久久久元码视频| 校园春色综合香蕉| 久久99精品九九久久久婷婷| 久久香蕉超碰97国产精品 | 96精品在线| 操操AV电影| 18一区二区三区| 97干色天堂| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 麻豆伊人网| 激情视频一二三| 中文有码第五页| 蜜臀久久99精品| 1024午夜激情男人的天堂| 亚洲熟女乱综合一区二区三区| 加勒比综合九九99视频在线播放| 欧美亚洲国产日本在线,久久精品国产| 欧美日韩亚洲天堂网| 午夜精品人妻二区三区| 色天使AV天堂| 粉嫩av在线| 国产日韩在线播放av| 日韩黄色成人性爱| 麻豆av一区二区三区| 91女优在线观看| 九九九九精品视频| 超碰成人公开| 秋霞蝌科网日本一区| 亚欧国产无码精品在线| 久草综合京东| 欧美色图亚洲色,麻豆| 立川理惠被中出无码| 91 亚洲 欧美 日韩 国产 综合| ,国产乱人伦精品一区二区三区| 最新精品久久蜜桃| 国产成人拍国产亚洲精品| 六十路日本| 热久久99999| 亚洲色图欧美色图另类图片| 久久九九综合| 在线五区| 天天干天天狼在线视频| 永久电影三级在线观看| 热久久无毒不卡| 亚洲图片欧美91N| 久久一区二区加油站| 国产高清在线自在拍69| 国产99精品一区二区三区免费| 亚洲AV资源| 张柏芝国产一区在线观看| 六月天婷婷| 91美女视频直播| 久久九色| 97久久国产| 日韩欧美女优电影| 自拍内地三级在线观看| 91在线限制级| 国产网红精品| 欧美日韩国产精品久久色婷婷| 亚洲 欧美日韩 另类| 蜜臀网址在线| 久超碰在| 国产成人99久久亚洲综合| www.夜夜操| 欧美在线永久天堂| 欧美日韩国产人人| 大香交伊人网| 十八禁av无码免费网站APP| 4虎在线视频| 婷婷午夜| 国产精品女久久久久av爽| 密臀成人视频久久久| 天天综合精品| 99国产在线 精品 视频| 日逼97| 熟女人妻av在线资源,黄色的资源| 中文字幕欧美日韩三级| 亚洲素人综合| 精品久久大胆人体| 欧美18禁91| 精品大久久| 九九无码视频| 欧美日韩性爱无码| 国产精品久久久久久高清无码免费看| 精品久久久一本一道| 婷婷精品视频| 中日韩久久久| 秋霞网—男女啪啪亚洲免费体验区 | 久久久久久久强迫| 九区国产| 综合天天网| 色噜噜综合在线| 偷拍欧美激情| 少妇被玩视频二三区| 伊人青青一区成人视频在线观看区| 丰满人妻一区二区三区四 | 无码人妻丰满熟妇奶水区毛片| 国产日本熟女顶级一区二区三区视频 | 一本道综合色图| 久久久九97| 99re这里只有精品中心播放| 亚洲精品国产AV天美传媒| 国产精品欧美激在线| 日韩精品人妻中文字有码在线| 加勒比综合九九99视频在线播放| 日本中文字幕一区| 欧美日韩妖精91com| 欧美天天性| 一级片在线观看高清无码| HEYZO高无码国产精品227| 欧美性爱在线无码| 老熟女熟妇| 无码人妻毛片丰满熟妇精品区| 葡萄牙性视频一二区| 欧美性生活男人的天堂| 无遮挡h肉动漫在线观看| 骚货人妻偷情自拍在线视频| 97免费视频在线观看视频| 人人妻人人爽| 亚洲乱码国产乱码精网站| 五月黑AⅤ| 91亚洲最新在线| 久久精品日韩| 日本女厕偷拍| 国产熟女无套内射| 日韩欧美国产高清视频| 好看的91视频| 男人亚洲天堂| 日韩乱码Av| 亚洲天堂电影网99999| 日本欧美一区二区三区免费| 欧美熟妇乱码在线一区| 97K超碰在线| 色情五月综合婷婷| 亚洲AV色图一区| 强奸乱伦av电影| 日韩精品9区| 日韩性爱1级片视频| 亚洲视频,小说| 激情熟女12P| 青青草男人天堂| 都市久久精品激情亚洲| 亚洲诱惑| 女同性恋久久| 麻豆熟妇乱妇熟色A片在线看| 男女激烈网站最新| 天美一二三在线观看Av| 一级性爱视频免费在线| 性色av网站| 久久久一二三四区| 91ise欧美| 东京热双插| 四虎国产成人精品免费一女五男| 亚洲伊人成综合成人网| 亚洲天堂另类小说男人| 一级岛国大片| 天天操熟妇| 国产日韩欧美三级片| 999热这里只有精品| 亚洲熟妇乱女区二区三区| 日韩中文字墓| 天天情欲宗合网| 91free福利| 男女一进一出视频久久| 国产第11页| 亚洲少妇喷视频看| 黄页网站免费高清在线观看| 超碰在线综合97| av亚洲天堂资源网站| 老司机老司机午夜影院| 人人妻人人爱人人玩| 美女露胸露屁股| 丁香五月激情综合国产| 91综合网| 超碰超碰超碰超碰的大鸡吧操黑丝袜 | 国产精品999zyz| 五十路一区无码| 小草av不卡亚洲二区 | 9精品久久| 少妇超碰在线| 久久女婷| 麻花传媒免费网站在线观看| 天堂成人网| 91久久午夜无码鲁丝片久久人妻| 精品一区二区综合熟妇| 男女啪啪网站免费视频| 亚洲 中文 欧美 日韩 在线| 天天做天天爽| 在线播放成人高清免费视频| 欧美成97爱| 操久久久久| 久久久亚洲精品中文字幕人妻| 日日橹狠狠爱欧美超碰| 91天美传媒精品| 九九热免费国产视频婷婷伊人| 天天弄天天操| 九九色影院| 少妇超碰在线| 熟妇亚洲一区二区三区| 色妹子A V| 97大色网| 九九九影院| 91色伦| 免费成人在线熟妇网| 男人成人黄色视频在线观看免费下载| 欧美综合在线91| 91美女视频在线| 九九人妻| 99av| 乱伦日本色图AⅤ| 激情综合五| 中文字幕艹艹| 91网站18在线| 99在线观看视频在线高清| 丰满人妻一区二区三区免费| 无码78| 亚洲精品性爱片| 丁香六月综合激情| 日韩欧美亚洲一区二区三区影院| 嗯嗯啊啊视频在线看| 欧美色997| 超碰色大香蕉| 亚洲91在线播放影院| 黄片www.| 欧亚揄拍偷拍精品视频 | 男人天堂综合| 99人妻| 国产无马av| 91 丝袜在线观看| 亚州综合网| 亚洲激情AV| 亚洲欧美变态| 国产a片操逼| 粘花网06av视频| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 神马久久久久久久久久久久| 青草伊人久久| 国产美女mm131爽爽爽爽| 日韩美一区| 男人亚洲天堂| 国产精品一区午夜福利| 爱爱动态试试看6 0秒| 国产偷拍网站| 婷婷国产精品九区| 亚洲情色综合| 日韩黄色一区二区三区| 美日韩一二三区| 51一区二区三区| 亚洲色交| 欧美精品偷拍| 天美传媒AV在线| 综合久久欧美| 啊a一区在线| 五月天精品| 日韩免费大片一级播放| 嗯嗯啊啊好大好爽| 高清一区AV无码| 熟女人妻av在线资源,黄色的资源 粉嫩国产精品久久粉嫩 | 啪啪视频亚洲第一| 国产女人9999| 人妻乱仑一区二区三区| 亚洲综合性网址| 99久久久无码国产精品性男| 综合少妇网| 日韩精品资源专区二区| 亚洲一卡2卡3卡4卡乱码网站 | 校园激情狠狠四射| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 成人av动漫在线观看| 人妻少妇精品无码专区二区密桃| 天天天天干| 亚洲一区二区AV| 蜜桃久久久久久久久久久久| TS人妖另类精品视频系列| 夜夜福利| 老色69| 日韩性爱小视频在线观看| 蜜臀99久久精品久久久久| 亚洲综合图片在线| 色色国产| 天天做日日爱夜夜爽| 91高潮| 最新精品久久蜜桃| 家庭乱伦性爱av| 精品免费囯产一区二区三区| 超碰97久久观看| 密臀在线免费观看| 亚洲精品日韩国产欧美| 久久九九国产精品| 日本成人A片网站| 欧美少妇色图| 三上悠亚在线毛片91| 少妇大屁屁| AV女资源| 97 色综合| 日日骚av| 日本操逼视频在线| 96国产精品| 色欲久久99精品久久| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 国产一区二区欧美日本| 91三级理论片播放器| 日韩乱伦AⅤ| 亚洲精品中文字幕一区在线视频| 日本高清视频xxxx| 中文一区在线视频| 探花激情视频| 久久曰曰| 中文字幕一二三区| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 留下AⅤ黄色片| 色色色999| 污啪啪啪视频| 啊啊啊啊啊啊好湿好爽视频| 99国内熟女露脸视频| 久久精品天美| 国产日本顶级一区二区三区| 亚洲欧美综合| 上海一级黄片| 亚洲va综合va国产va中文| 超碰人妻久久人妻中文97| 亚洲情色在线| 99999re| 激情网色| 日韩三四五区| 久久噜噜噜精品国产亚洲综合| 夜草欧美| 91成人精品在线播放| 欧美国产日韩清纯唯美| 污污污8888| 欧美碰碰综合色| 日本一区视频在线观看| 久久国产视频性吧| 91网站视频在线观看| 人妻熟女一区二区三区视频| 久久无码成人| www四虎| 四虎884| 久操网址| 台湾大香蕉99热| 日韩三级伊人| 色色婷婷五月| 综合网亚洲1| 天天操夜夜嗨| 后入式视频国产自| 中国操逼无码| 五月天综合网| 啊啊啊啊好疼| 亚洲精品亚洲人成人网| 青青草AV色| 亚洲无992tv| 日日干日日操五月天伦理视频| 天天噜| 日韩99神马视频播放片在线播放| 欧美性夜| 第四色亚洲色图| 色吧5亚洲| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 超碰欧美97| 日本曲间由美性生活片| 91久久久亚洲| 亚洲第91页 | 鲁鲁色综合网| 性爱乱伦视频免费| 一区二三区四区视频大全套| 性在久久久久久| 亚洲美女精品九九视频| 99久久久无码| 亚洲精品无码成人久久久99| 99热 按摩 日韩| 婷婷丁香五月天亚洲天堂网| 色综合1991| 夜夜狠狠躁日日躁色视频| 亚洲国产高清福利视频| 国产白丝网站| 二级久久网| 精品国产一区二区三区av在线资源| 天天噜| 久肏视频字幕| 欧美中字二区| 3571色综合一区二区二区| 亚洲成?V人片在线观看福利| 精…码一二三区| 亚洲日韩东京热一区| 国产高清无码一区三区二区| 国产午夜福利合集| 簧片免费看视频| 久久久久久电影| 在线视频资源| 67194无码不卡| 色狠狠综合| 伊人一区二区在线播放| 精品人妻视频一区二区在线播放 | 操东北女人| 91中文字幕在线观看| 330dv亚洲成年视频网| 97中文超碰| 亚洲一区深夜| 五月婷婷六月色| 国产精品久久久久av| 蜜乳AV网址| 熟女人妇一区二区三区| 日韩av电影成人在线| 亚洲综合影院| 亚洲毛片基地专区| 久久超碰大香蕉| 九月AV| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 亚洲色图 欧美热图 清纯唯美 另类自拍 | 热久久国产精品视频大陆精品| 涩五月婷婷| 免费一级毛片在线视频观看| 五月丁香成人网| 无码91| www鬼畜国产男人的天堂| 亚洲砖码砖专无区2023| 国产精品操| 91爱看| 欧美激情 亚洲色图| 亚洲色婷婷久久久综合日本| a男人的天堂久久一级A毛片| 日本成人A片网站| 蜜桃av综合网发布| 91蜜臀在线久久久久| 亚洲天堂女优在线| 91超碰在线播放| 国产在线观看一区二区三区| 91麻豆天美传媒在线| 高潮的A片激情扒开一区| 操99| 一本色道久久综合熟妇| 91综合网站| 日人妻视频91| 国产精品经典一卡久久久| 91精产一区二区三区| a级免费在线观看| 久久久97| 欧美在线第五页| 无码直播久久久| 五月丁香网站| 91丝袜人妻| 精品亚洲国产成人精品| 欧美熟妇精品黑人巨大一二三区| 四虎影视国产精品| aⅴ日韩成人电影av在线免费看av大全 | 欧美综合网站999| 久综合国内精品自在自线| 欧美在线伊人色| 欧美综合综合| 亚洲综合中文字幕有码| 欧美性生活内射| 俄罗斯一区二区视频在线观看| A V少妇特黄三级| 97欧美综合| 天天综合91在线| 国产精品美女久久久久久网站| 久久久蜜桃一区二区三区| 久久日本熟妇熟色一区| 99综合视频一体| 91人人操| 爱爱动态试试看6 0秒| 国产大陆天天艹| 97久久国产亚洲精品超碰热| av一区二区三区 中文| 天天在线91| 青青草原人妻| 韩三级a视频在线观看| 在线小说视频一区| 亚洲乱码国产乱码精网站| 天天天堂影视日韩亚洲91| 国产精品乱码久久| 厕所偷拍在线| 乱伦一二三区| 欧美性五月| 色婷婷aV一区二区三区麻豆综合| xxxx网站亚洲精品| 日本不卡中文| 91在线美女| 国产女人操逼视频| 无码久久国产 | 青青草精品| 久热无码| 人人摸人人添人人操| 亚洲欧美综合网 | 精品人妻一区二区三区四区不卡在| 国产60区。| 又大又黄国产| 欧美日本一区二区a人| 日婷婷| 亚洲精品久久久久久久蜜桃臀| 狠操91,com| 欧美 牲| 大香蕉伊人在线成人AV在线观看| 另类在线| 97国产高清视频在线观看| 成年人黄色小视频网站| 丰满人妻区一区二区三| 人爽不卡视频|