精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入理解 Express.js

開發 前端
本文針對那些對Node.js有一定了解的讀者。假設你已經知道如何運行Node代碼,使用npm安裝依賴模塊。但我保證,你并不需要是這方面的專家。本文針對的是Express 3.2.5版本,以介紹相關概念為主。

本文針對那些對Node.js有一定了解的讀者。假設你已經知道如何運行Node代碼,使用npm安裝依賴模塊。但我保證,你并不需要是這方面的專家。本文針對的是Express 3.2.5版本,以介紹相關概念為主。

Express.js這么描述自己:”輕量靈活的Node.js Web應用框架”。它可以幫助你快速搭建web應用。如果你使用過Ruby里的Sinatra,那么相信你對這個也會很快就能熟悉。

和其他web框架一樣,Express隱藏了代碼背后的祕密,然后告訴你:”別擔心,你不用去理解這個部分”。它來幫你解決這些問題,所以你不用去為這個而煩惱,只用將重心集中到代碼上。換句話說,它有某些魔法!

Express的wiki里介紹了一些它的使用者,其中就有很多知名的公司: MySpace, Klout.

但是擁有魔力是需要付出代價的,你可能根本就不知道它的工作原理。正如駕駛一輛汽車,我可以很好的駕馭它但是可能不理解為什么汽車可以正常工作,但是我最好知道這些東西。如果車壞掉怎么辦?如果你想最大程度的去發揮它的性能?如果你對知識有無限的渴望并想去弄清它?

那么我首先從理解Express的最底層-Node開始。

底層:Node HTTP服務器

Node中有HTTP模塊, 它將搭建一個web服務器的過程抽象出來。你可以這樣使用:

  1. // 引入所需模塊  
  2. var http = require("http");  
  3.    
  4. // 建立服務器  
  5. var app = http.createServer(function(request, response) {  
  6.     response.writeHead(200, {  
  7.         "Content-Type""text/plain"     
  8.     });  
  9.     response.end("Hello world!\n");  
  10. });  
  11.    
  12. // 啟動服務器  
  13. app.listen(1337, "localhost");  
  14. console.log("Server running at http://localhost:1337/"); 

運行這個程序(假設文件名為 app.js ,運行 node app.js ),你會得到”Hello world!“ 在瀏覽器訪問localhost:1337 ,你會得到同樣的結果。你也可以嘗試訪問其他地址,如 localhost:1337/whatever ,結果仍然會一樣。

分解以上代碼來看。

第一行使用 require 函數引入Node內置模塊 http 。然后存入名為 http 的變量中。如果你要了解更多關于require函數的知識,參考Nodejitsu的文檔。

然后我們使用 http.createServer 將服務器保存至 app 變量。它將一個函數作為參數監聽請求。稍后將會詳細介紹它。

最后我們要做的就是告訴服務器監聽來自1337端口的請求,之后輸出結果。然后一切完成。

好的,回到request請求處理函數。這個函數相當重要。

request方法

在開始這個部分之前,我事先聲明這里所涉及的HTTP相關知識與學習Express本身沒有太大關係。如果你感興趣,可以查看HTTP模塊文檔

任何時候我們向服務器發起請求,request方法將會被調用。如果你不信,你可以 console.log 將結果打印出來。你會發現每次請求一個頁面時它都會出來。

request 是來自客戶端的請求。在很多應用中,你可能會看到它的縮寫 req 。仔細看代碼。我們修改代碼如下:

  1. var app = http.createServer(function(request, response) {  
  2.    
  3.     // 創建answer變量  
  4.     var answer = "";  
  5.     answer += "Request URL: " + request.url + "\n";  
  6.     answer += "Request type: " + request.method + "\n";  
  7.     answer += "Request headers: " + JSON.stringify(request.headers) + "\n";  
  8.    
  9.     // 返回結果  
  10.     response.writeHead(200, {"Content-Type""text/plain" });  
  11.     response.end(answer);  
  12.    
  13. }); 

重啟服務器并刷新 localhsot:1337 .你會發現,每次訪問一個URL,就會發起一次GET請求,并會得到一堆類似用戶代理或者一些其他的更加複雜的HTTP相關信息。如果你訪問 localhost:1337/what_is_fraser, 你會看到request的地址發生了變化。如果你使用不同的瀏覽器訪問,用戶代理也會跟著改變,如果你使用POST請求,request的方法也很改變。

response 是另外一個部分。正如 request 被縮寫為 req ,response 同樣被簡寫為 res 。每次response你都會得到對應的返回結果,之后你便可以通過調用 response.end 來結束。實際上最終你還是要執行這個方法的, 甚至在node的文檔里也是這么描述的。這個方法完成了真正的數據傳輸部分。你可以建立一個服務器并不調用 req.end 方法,它就會永遠存在。

在你返回結果之前,你也可以填寫一下header頭部部分。我們的例子里是這么寫的:

  1. response.writeHead(200, { "Content-Type""text/plain" }); 

這個步驟主要完成兩件事情。第一,發送HTTP狀態碼,表示請求成功。其次,它設置了返回的頭部信息。這里表示我們要返回的是純文本格式的內容。我們也可以返回類似JSON或者HTML格式的內容。

未完待續。。。

// 接上回

看了上面的之后,你可能會立馬開始利用它來寫api了。

  1. var http = require("http");  
  2.    
  3. http.createServer(function(req, res) {  
  4.    
  5.     // Homepage  
  6.     if(req.url == "/") {  
  7.         res.writeHead(200, { "Content-Type""text/html" });  
  8.         res.end("Welcome to the homepage!");  
  9.     }  
  10.    
  11.     // About page  
  12.     else if (req.url == "/about") {  
  13.         res.writeHead(200, { "Content-Type""text/html" });  
  14.         res.end("Welcome to the about page!");  
  15.     }  
  16.    
  17.     // 404'd!  
  18.     else {  
  19.         res.writeHead(404, { "Content-Type""text/plain" });  
  20.         res.end("404 error! File not found.");  
  21.     }  
  22.    
  23. }).listen(1337, "localhost"); 

你可以選擇優化代碼,讓它變得更整潔。也可以向npm.org的那幫傢伙一樣用原生的Node來編寫。但是你也可以選擇去創建一個框架。這就是Sencha所做的,并把這個框架稱為 – Connect.

中間件: Connect

Connect是Nodejs的中間件。可能你現在還并不太理解什么是中間件(middleware),別擔心,我馬上會進行詳細解釋。

一段Connect代碼

假如我們想要編寫和上面一樣的代碼,但是這次我們要使用Connect.別忘記安裝Connect模塊(npm install)。完成之后,代碼看起來非常相似。

  1. // 引入所需模塊  
  2. var connect = require("connect");  
  3. var http = require("http");  
  4.    
  5. // 建立app  
  6. var app = connect();  
  7.    
  8. // 添加中間件  
  9. app.use(function(request, response) {  
  10.     response.writeHead(200, { "Content-Type""text/plain" });  
  11.     response.end("Hello world!\n");  
  12. });  
  13.    
  14. // 啟動應用  
  15. http.createServer(app).listen(1337); 

下面分解這段代碼來看。

首先我們分別引入了Connect和Node HTTP模塊。

接下來和之前一樣聲明 app 變量,但是在創建服務器時,我們調用了 connect().這有是如何工作的?

我們添加了一個中間件,實際上就是一個函數。傳入 app.use ,幾乎和上面使用request方法寫法一樣。實際上代碼是從上面粘貼過來的。

之后我們建立并啓動服務器。 http.createServer 接收函數作為參數。沒錯,app 實際上也是一個函數。這是一個Connect提供的函數,它會查找代碼并自上而下執行。

(你可能會看見其他人使用 app.listen(1337), 這實際上只是將 http.createServer 返回一個promise對象。 再Connect和Express中都是一樣的原理。)

接下來解釋什么是中間件(middleware).

什么是中間件?

首先推薦閱讀Stephen Sugden對于Connect中間件的描述,比我講的更好。如果你不喜歡我的解釋,那就去看看。

還記得之前的request方法?每個中間件都是一個handler.依次傳入request, response, next三個參數。

一個最基本的中間件結構如下:

  1. function myFunMiddleware(request, response, next) {  
  2.     // 對request和response作出相應操作  
  3.     // 操作完畢后返回next()即可轉入下個中間件  
  4.     next();  

當我們啓動一個服務器,函數開始從頂部一直往下執行。如果你想輸出函數的執行過程,添加一下代碼:

  1. var connect = require("connect");  
  2. var http = require("http");  
  3. var app = connect();  
  4.    
  5. // log中間件  
  6. app.use(function(request, response, next) {  
  7.     console.log("In comes a " + request.method + " to " + request.url);  
  8.     next();  
  9. });  
  10.    
  11. // 返回"hello world"  
  12. app.use(function(request, response, next) {  
  13.     response.writeHead(200, { "Content-Type""text/plain" });  
  14.     response.end("Hello World!\n");  
  15. });  
  16.    
  17. http.createServer(app).listen(1337); 

如果你啓動應用并訪問 localhost:1337,你會看到服務器可以log出相關信息。

有一點值得注意,任何可以在Node.js下執行的代碼都可以在中間件執行。例如上面我們所使用的req.method 方法。

你當然可以編寫自己的中間件,但是也不要錯過Connect的一些很cool的第三方中間件。下面我們移除自己的log中間件,使用Connect內置方法。

  1. var connect = require("connect");  
  2. var http = require("http");  
  3. var app = connect();  
  4.    
  5. app.use(connect.logger());  
  6. // 一個有趣的事實:connect.logger返回一個函數  
  7.    
  8. app.use(function(request, response) {  
  9.     response.writeHead(200, { "Content-Type""text/plain" });  
  10.     response.end("Hello world!\n");  
  11. });  
  12.    
  13. http.createServer(app).listen(1337); 

跳轉至瀏覽器并訪問 localhost:1337 你會得到同樣的結果。

很快有人就會想使用上面的中間件組合起來創建一個完整應用。代碼如下:

  1. var connect = require("connect");  
  2. var http = require("http");  
  3. var app = connect();  
  4.    
  5. app.use(connect.logger());  
  6.    
  7. // Homepage  
  8. app.use(function(request, response, next) {  
  9.     if (request.url == "/") {  
  10.         response.writeHead(200, { "Content-Type""text/plain" });  
  11.         response.end("Welcome to the homepage!\n");  
  12.         // The middleware stops here.  
  13.     } else {  
  14.         next();  
  15.     }  
  16. });  
  17.    
  18. // About page  
  19. app.use(function(request, response, next) {  
  20.     if (request.url == "/about") {  
  21.         response.writeHead(200, { "Content-Type""text/plain" });  
  22.         response.end("Welcome to the about page!\n");  
  23.         // The middleware stops here.  
  24.     } else {  
  25.         next();  
  26.     }  
  27. });  
  28.    
  29. // 404'd!  
  30. app.use(function(request, response) {  
  31.     response.writeHead(404, { "Content-Type""text/plain" });  
  32.     response.end("404 error!\n");  
  33. });  
  34.    
  35. http.createServer(app).listen(1337); 

“這個看起來不太好看!我要自己寫框架!”

某些人看了Connect的代碼之后覺得,“這個代碼可以更簡單”。于是他們創造了Express.(事實上他們好像直接盜用了Sinatra.)

#p#

最頂層: Express

文章進入第三部分,我們開始真正進入Express.

正如Connect拓展了Node, Express拓展Connect.代碼的開始部分看起來和在Connect中非常類似:

  1. var express = require("express");  
  2. var http = require("http");  
  3. var app = express(); 

結尾部分也一樣:

  1. http.createServer(app).listen(1337); 

中間部分纔是不一樣的地方。Connect為我們提供了中間件,Express則為我們提供了另外三個優秀的特性: 路由分發,請求處理,視圖渲染。首先從如有開始看。

特性一:路由

路由的功能就是處理不同的請求。在上面的很多例子中,我們分別有首頁,關于和404頁面。我們是通過 if 來判斷并處理不同請求地址。

但是Express卻可以做的更好。Express提供了”routing”這個東西,也就是我們所說的路由。我覺得可讀性甚至比純文字還要好。

  1. var express = require("express");  
  2. var http = require("http");  
  3. var app = express();  
  4.    
  5. app.all("*"function(request, response, next) {  
  6.     response.writeHead(404, { "Content-Type""text/plain" });  
  7.     next();  
  8. });  
  9.    
  10. app.get("/"function(request, response) {  
  11.     response.end("Welcome to the homepage!");  
  12. });  
  13.    
  14. app.get("/about"function(request, response) {  
  15.     response.end("Welcome to the about page!");  
  16. });  
  17.    
  18. app.get("*"function(request, response) {  
  19.     response.end("404!");  
  20. });  
  21.    
  22. http.createServer(app).listen(1337); 

簡單的引入相關模塊之后,我們立即調用 app.all處理所有請求。寫法看起來也非常像中間件不是嗎?

代碼中的 app.get 就是Express提供的路由系統。也可以是 app.post 來處理POST請求,或者是PUT和任何的HTTP請求方式。第一個參數是路徑,例如 /about 或者 /。第二個參數類似我們之前所見過的請求handler。引用Expess文檔的內容:

這些請求handler和中間件一樣,唯一的區別是這些回調函數會調用 next('route') 從而能夠繼續執行剩下的路由回調函數。這種機制

簡單說來,它們和我們之前提過的中間件是一樣,只不過是一些函數而已。

這些路由也可以更加靈活,看起來是這樣:

  1. app.get("/hello/:who"function(req, res) {  
  2.     res.end("Hello, " + req.params.who + ".");      
  3. }); 

重啟服務器并在瀏覽器訪問 localhost:1337/hello/animelover69 你會得到如下信息:

  1. <code>Hello, animelover69. </code> 

這些文檔演示了如何使用正則表達式,可以使得路由更加靈活。如果只是單從概念理解來講,我說的已經足夠了。

但是還有更加值得我們去關注的。

特性二:請求處理 request handling

Express將你傳入請求的handler傳入request和response對象中。原先該有的還在,但是卻加入了更多新的特性。API文檔里有詳細解釋。下面讓我們來看一些例子。

其中一個就是 redirect 方法。代碼如下:

  1. response.redirect("/hello/anime");  
  2. response.redirect("http://xvfeng.me");  
  3. response.redirect(301, "http://xvfeng.me"); // HTTP 301狀態碼 

以上代碼既不屬于原生Node代碼也不是來自與Connect,而是Express中自身添加的。它加入了一些例如sendFile,讓你傳輸整個文件等功能:

  1. response.sendFile("/path/to/anime.mp4"); 

request對象還有一些很cool的屬性,例如 request.ip 可以獲取IP地址, request.files 上傳文件等。

理論上來講,我們要知道的東西也不是太多,Express做的只是拓展了request和response對象而已。Express所提供的方法,請參考API文檔.

特性三:視圖

Express可以渲染視圖。代碼如下:

  1. // 啟動Express  
  2. var express = require("express");  
  3. var app = express();  
  4.    
  5. // 設置view目錄  
  6. app.set("views", __dirname + "/views");  
  7.    
  8. // 設置模板引擎  
  9. app.set("view engine""jade"); 

開頭部分的代碼和前面基本一樣。之后我們指定視圖文件所在目錄。然后告訴Express我們要使用 Jade作為模板引擎。 Jade是一種模板語言。稍后將會詳細介紹。

現在我們已經設置好了view.但是如何來使用它呢?

首先我們建立一個名為 index.jade 的文件并把它放入 views 目錄。代碼如下:

  1. doctype 5  
  2. html  
  3.   body  
  4.     h1 Hello, world!  
  5.     p= message 

代碼只是去掉了括號的HTML代碼。如果你懂HTML那肯定也看得懂上面的代碼。唯一有趣的是最后一樣。 message 是一個變量。它是從哪里來的呢?馬上告訴你。

我們需要從Express中渲染這個視圖。代碼如下:

  1. app.get("/"function(request, response) {  
  2.     response.render("index", { message: "I love anime" });      
  3. }); 

Express為 response 對象添加了一個 render 方法。這個方法可以處理很多事情,但最主要的還是加載模板引擎和對應的視圖文件,之后渲染成普通的HTML文檔,例如這里的 index.jade.

最后一步(我覺得可能算是第一步)就是安裝Jade,因為它本身并不是Express的一部分。添加至package.json 文件并使用 npm install 進行安裝。

如果一起設置完畢,你會看到這個頁面完整代碼.

加分特性: 所有代碼來自于Connect和Node

我需要再次提醒你的是Express建立與Connect和Node之上,這意味著所有的Connect中間件均可以在Express中使用。這個對與開發來講幫助很大。例如:

  1. var express = require("express");  
  2. var app = express();  
  3.    
  4. app.use(express.logger());  // 繼承自Connect  
  5.    
  6. app.get("/"function(req, res) {  
  7.     res.send("fraser");      
  8. });  
  9.    
  10. app.listen(1337); 

如果說你從這篇文章中學到了一點什么,就是這一點。

實戰

本文的大部分內容都是理論,但是下面我將教你如何使用它來做一點你想做的東西。我不想說的過于具體。

你可以將Express安裝到系統全局,從而可以在命令行使用它。它可以幫助你迅速的完成代碼組織并啓動應用。使用npm安裝:

  1. <code># 安裝時可能需要加 `sudo` npm install -g express </code> 

如果你需要幫助,輸入 express --help 。它加入一些可選參數。例如,如果你想使用EJS模板引擎,LESS作為CSS引擎。應用的名稱為”myApp”.輸入以下命令:

  1. <code>express --ejs --css less myApp </code> 

這里會自動生成很多文件。進入項目目錄,并使用 npm install 安裝依賴包,之后便可以使用 node app啓動應用!我建議你詳細的查看項目結構和代碼。它可能還算不上一個真正的應用,但是我覺得它對于初學者來講還是很有幫助的。

項目Github目錄下也有一些很有幫助的文檔。

一些補充

  • 如果你也和我一樣喜歡使用CoffeeScript,好消息是Express完美支持CoffeeScript.你甚至不需要編譯它。這樣你只用 coffee app.coffee 即可啓動應用。我在我的其他項目中也是這么做的。
  • 在我看到 app.use(app.router) 的時候我很疑惑: Express不是一直在使用router嗎?簡單回答是app.router 是Express的路由中間件,在你定義路由的時候被直接添加到項目中。如果你需要在加載其他文件之前應用,也可以直接引入它。關于這么做的原因,請參考StackOverflow的這個答桉.
  • 本文是針對Express 3,而在第四版的規劃中又會有很多大的改動。最明顯的是,Experss可能要將會分解成一些小的模塊,并吸收Connect的一些特性。這個雖然還在計劃中,但是也值得一看。

如果這個還不能滿足你?你肯定是個變態!你很快就會變成像一個癮君子,半睜著眼,耗盡你最后一點精力,寫著苦逼的代碼。

正如Rails成為使用Ruby建立網頁應用的王者一樣,我覺得Express也會成為Node中的主流。但是和Rails不一樣,Express 更加底層。似乎還沒有一個真正意義上的高級Node庫。我覺得可能會發生改變。(譯者注:這點我不同意,Node的很多思想來自與Unix哲學,強調的是一個Module只解決一個問題,而不是成為一個複雜的庫。很多Rails的開發者轉向Node,就是因為Rails正在逐漸變得臃腫,不易自定義,且效率逐漸降低。)。

這里我就不再多談。已經又很多很基于Express建立了新的東西,Expess的維基里有列舉。如果你覺得好可以隨意使用它們,如果你喜歡從底層做起,你也可以只選擇Express。不管是哪一種,好好利用它吧。

原文地址:http://evanhahn.com/understanding-express-js/

譯文鏈接:Fraser Xu

責任編輯:林師授 來源: xvfeng.me
相關推薦

2019-02-21 10:38:10

Web 開發代碼

2021-08-05 05:46:06

Node.jsInspector工具

2021-10-16 05:00:32

.js Buffer模塊

2016-12-08 15:36:59

HashMap數據結構hash函數

2020-07-21 08:26:08

SpringSecurity過濾器

2010-06-01 15:25:27

JavaCLASSPATH

2017-04-24 08:31:26

Node.jsExpress.jsHTTP

2021-08-26 13:57:56

Node.jsEncodingBuffer

2021-08-12 01:00:29

NodejsAsync

2009-09-25 09:14:35

Hibernate日志

2021-02-17 11:25:33

前端JavaScriptthis

2023-10-19 11:12:15

Netty代碼

2013-09-22 14:57:19

AtWood

2017-08-15 13:05:58

Serverless架構開發運維

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2020-09-23 10:00:26

Redis數據庫命令

2017-01-10 08:48:21

2024-02-21 21:14:20

編程語言開發Golang

2025-06-05 05:51:33

2019-06-25 10:32:19

UDP編程通信
點贊
收藏

51CTO技術棧公眾號

精品人人人人| 高清美女视频一区| 精品动漫3d一区二区三区免费| 日韩一区二区影院| 成人一区二区免费视频| 飘雪影视在线观看免费观看| 欧美精品一区二区蜜桃| 8av国产精品爽爽ⅴa在线观看| 久久久久国产精品麻豆| 国产精品丝袜高跟| 欧美精品乱码视频一二专区| 欧美爱爱网站| 欧美乱妇15p| 韩日视频在线观看| 成年人在线免费观看| 国产裸体歌舞团一区二区| 91av在线精品| 在线观看亚洲网站| 色婷婷久久久| 欧美电影一区二区| 久久美女福利视频| av小次郎在线| 久久久精品综合| 91久久精品一区二区别| 日本视频在线观看免费| 亚洲欧洲日韩| 亚洲免费中文字幕| 精品人妻人人做人人爽夜夜爽| 成人动漫一区| 亚洲一卡二卡三卡四卡无卡久久| 色女孩综合网| 性感美女一级片| 国产精品一区二区果冻传媒| 国产精品久久久久久久9999 | 韩国av免费观看| 波多野结衣在线观看一区二区| 精品国产三级电影在线观看| 一起操在线视频| 97久久香蕉国产线看观看| 亚洲一区二区三区在线| 久久99国产精品一区| 国产精品久久久久久久龚玥菲 | 在线日韩av片| 性欧美大战久久久久久久| 天堂地址在线www| 国产午夜久久久久| 久久精品美女| 欧美一级特黄aaaaaa| 亚洲天堂日韩av| 日本精品600av| 亚洲国产精品成人综合色在线婷婷 | 日韩亚洲国产中文字幕欧美| 999精品视频在线| 欧亚在线中文字幕免费| 亚洲国产裸拍裸体视频在线观看乱了| 日本免费在线视频观看| 国产精品一区在线看| 91亚洲午夜精品久久久久久| 国产精品二区在线观看| 精品国自产在线观看| 精品一区二区三区视频| 国产精品永久免费视频| 亚洲一区二区三区高清视频| 日本美女视频一区二区| 国产精品青青在线观看爽香蕉| 欧美日韩一级黄色片| 亚久久调教视频| 91大神福利视频在线| av大全在线观看| 先锋亚洲精品| 国产精品第2页| 在线观看视频二区| 另类人妖一区二区av| 国产久一一精品| 91成年人视频| 国产成人综合亚洲网站| 99久久无色码| 欧美熟妇交换久久久久久分类 | 精品人伦一区二区三区蜜桃网站| 国产日韩欧美精品在线观看| 美女的胸无遮挡在线观看| 狠狠色狠狠色综合日日五| 免费日韩视频在线观看| www.一区| 日韩一区二区在线看| 91超薄肉色丝袜交足高跟凉鞋| 国产精品极品| 亚洲欧美另类在线观看| 在线观看天堂av| 欧美激情视频一区二区三区在线播放 | 日韩欧美一区免费| 美女av一区二区三区| 国产一级免费av| 新狼窝色av性久久久久久| 国产精品久久久久福利| 国产免费av电影| gogo大胆日本视频一区| 色播亚洲视频在线观看| 天堂av中文在线| 日韩欧美福利视频| √天堂资源在线| 老汉色老汉首页av亚洲| 国产亚洲精品91在线| 欧美精品成人久久| 日本伊人色综合网| 国产日韩欧美二区| 日本一区二区三区www| 99久久精品国产一区二区成人| 成人免费看黄yyy456| 日韩.欧美.亚洲| 欧美人与性动交α欧美精品图片| 日韩美女视频免费在线观看| 青娱乐免费在线视频| 国产精品资源| 成人亚洲激情网| 亚洲久久一区| 精品视频在线观看日韩| 手机毛片在线观看| 欧美另类女人| 国产成人一区二区三区| a网站在线观看| 国产视频一区不卡| 日韩极品视频在线观看 | 97在线观看视频国产| 中文字幕在线视频免费| 成人h动漫精品| 在线免费一区| 午夜精品成人av| 精品久久久久久久一区二区蜜臀| 在线观看免费小视频| 99热免费精品| 亚洲jizzjizz日本少妇| 粉嫩av一区| 欧美日韩国产中字| 在线观看亚洲免费视频| 欧美www视频在线观看| 日韩美女中文字幕| 少妇又色又爽又黄的视频| 亚洲精品国久久99热| 亚洲国产日韩欧美在线观看| 欧美**字幕| 91av视频在线免费观看| 国产成人无码www免费视频播放| 国产精品视频一二三| 欧美丰满熟妇xxxxx| 羞羞答答一区二区| 97在线看免费观看视频在线观看| 国产夫妻性生活视频| 自拍av一区二区三区| 在线免费观看视频黄| 精品av一区二区| 日本午夜人人精品| 欧美日韩伦理片| 精品久久久久久久大神国产| 在线黄色免费网站| av不卡在线| 久久精品国产一区二区三区日韩| 国产精品论坛| 日韩精品亚洲元码| 精品欧美一区二区三区免费观看| 99re视频精品| 欧美深夜福利视频| 日本中文字幕在线一区| 69av成年福利视频| 欧美69xxxxx| 在线精品国精品国产尤物884a | 国产精品欧美久久久久无广告| 欧美精品成人网| 精品一区二区三区在线| 国产精品爽黄69天堂a| 香蕉视频网站在线观看| 欧美日韩国产另类一区| 永久免费看片直接| 国产精品一区二区三区网站| 国产免费内射又粗又爽密桃视频| 亚洲码欧美码一区二区三区| 久久久亚洲影院| 天堂av在线7| 91久久久免费一区二区| 国产3级在线观看| 国产精品原创巨作av| 亚洲精品久久久久久久蜜桃臀| 日韩电影不卡一区| 国产精品久久久久久av福利| 欧美尤物美女在线| 日韩精品专区在线影院观看| 日本天堂在线视频| 久久精品日产第一区二区三区高清版 | 韩国av永久免费| 欧美日韩国产一区二区三区| 少妇无套高潮一二三区| 狠狠色丁香久久婷婷综合_中| 男人添女人荫蒂免费视频| 久久av免费看| 亚洲在线第一页| 欧美13videosex性极品| 日韩在线观看成人| 午夜精品在线播放| 91黄视频在线| 久草资源在线视频| 久久久久久综合| 黄色片子免费看| 久久精品九九| 日韩人妻一区二区三区蜜桃视频| 欧美爱爱网站| 亚洲精品女av网站| 婷婷午夜社区一区| 欧美黑人巨大精品一区二区| 黄色软件在线观看| 精品区一区二区| 九九热最新视频| 亚洲一卡二卡三卡四卡无卡久久 | 综合色中文字幕| 亚洲综合自拍网| 狠狠狠色丁香婷婷综合激情| 国产美女三级视频| 欧美 日韩 国产 一区| 日本免费高清一区二区| 北条麻妃在线一区二区免费播放| 国产精品日韩av| 桃色av一区二区| 免费av一区二区| 91高清在线| 日韩久久午夜影院| 亚洲精品无码久久久| 欧美日韩一二三| 狠狠人妻久久久久久| 亚洲成人激情av| 欧美国产日韩在线观看成人 | 精品国产一区二区三区麻豆小说| 国产精品亚洲欧美日韩一区在线| 国产成人综合av| 欧美aaaaa性bbbbb小妇| 欧美激情一区二区三区在线视频观看| 久久99精品久久久久久野外| 亚洲免费一在线| 五月婷婷在线播放| 亚洲成人网久久久| 亚洲成人黄色片| 欧美一区午夜视频在线观看 | 日韩成人伦理| 精品国产一区二区三区久久久狼| 国产精品一区在线看| 亚洲精品一区av在线播放| 内射后入在线观看一区| 日韩精品最新网址| 精品区在线观看| 欧美一区二区三区在线观看视频| 一级黄色片在线播放| 欧美视频一区二区三区在线观看| 亚洲熟妇无码乱子av电影| 精品福利在线视频| 国产精品午夜影院| 欧美日韩国产在线播放| 亚洲一区二区91| 亚洲成在人线在线播放| 日本系列第一页| 亚洲高清久久久| 日本天堂在线视频| 欧美午夜视频一区二区| 亚洲黄色激情视频| 色综合久久综合| 亚洲第一网站在线观看| 在线观看欧美黄色| 一本色道久久综合无码人妻| 91.麻豆视频| 亚洲AV无码成人片在线观看| 精品久久国产老人久久综合| 人妻精品无码一区二区| 亚洲男人天堂久| 少妇喷水在线观看| 亚洲女人天堂网| av在线日韩国产精品| 久久精品成人一区二区三区 | 亚洲欧洲国产专区| 黄色一级片中国| 一区二区三区免费网站| 国产无遮挡aaa片爽爽| 欧美日韩人人澡狠狠躁视频| 精品久久久久久久久久久久久久久久久久| 欧美性videosxxxxx| 国产美女无遮挡永久免费| 亚洲成人黄色网址| 欧美日韩国产综合视频| 久久精品小视频| japanese色国产在线看视频| 日韩av123| 最新日韩一区| 国产精品免费视频久久久| 国产在线一区不卡| 九色91视频| 日本欧美国产| 日韩精品一区二区免费| 久久男女视频| 亚洲精品一区二区18漫画| 久久噜噜亚洲综合| www色aa色aawww| 精品日本高清在线播放| 91好色先生tv| 亚洲精品久久久久| 天堂地址在线www| 91国产视频在线| 日韩第二十一页| 九九九九九九精品| 亚洲精品成人| 国产精品亚洲二区在线观看| 国产一区二区三区美女| 国产精品三级在线观看无码| 亚洲欧美日韩久久精品| 黄色片视频免费| 日韩精品一区二区三区视频| av电影在线观看网址| 久久久久中文字幕2018| 欧美日韩伦理一区二区| 久久精品人人做人人爽电影| 91精品国产视频| 激情婷婷综合网| 成人免费不卡视频| 国产小视频你懂的| 色综合天天性综合| 亚洲av无码乱码国产麻豆| 最新国产成人av网站网址麻豆| 91老司机福利在线| 91青青草免费观看| 久久高清免费| 日本精品www| av一二三不卡影片| 亚洲国产精品久| 欧美日韩成人在线一区| 久久精品蜜桃| 97在线视频一区| 一区二区三区视频免费视频观看网站| 亚洲精品9999| 日本不卡在线视频| 精品人妻一区二区三区香蕉| 亚洲国产欧美一区二区三区丁香婷| 国产乱码久久久久| 色老头一区二区三区| 日本欧美韩国| 欧美尤物一区| 可以看av的网站久久看| 一区二区不卡免费视频| 亚洲午夜久久久| 午夜精品久久久久久久99| 九九热精品视频国产| 欧美第一在线视频| 中文字幕精品在线播放| 国内精品在线播放| 夫妻性生活毛片| 69久久夜色精品国产69蝌蚪网| 欧美a免费在线| 成人疯狂猛交xxx| 91久久国产| 特级西西444www| 亚洲免费伊人电影| 国产白浆在线观看| 久久成人一区二区| 欧美大片91| 国产美女在线一区| aaa国产一区| 羞羞影院体验区| 亚洲欧美日韩另类| 成人免费网站www网站高清| 视频在线观看成人| 麻豆精品一二三| www深夜成人a√在线| 精品国产一区二区亚洲人成毛片 | 国产亚洲精品bt天堂精选| www.国产毛片| 中文字幕精品一区久久久久 | 国模大胆一区二区三区| 一级黄色片毛片| 欧美日韩色婷婷| 成人免费高清在线播放| 成人国产精品久久久| 国内精品99| 久操视频免费看| 在线观看www91| 综合久久2019| 久久久久久国产精品一区| 三级欧美韩日大片在线看| 国产精品1区2区3区4区| 日韩一区二区免费在线电影| 91黄页在线观看| 日韩影院一区| 国产一区二区三区高清播放| 日本三级中文字幕| 亚洲午夜精品久久久久久性色 | 亚洲精品日产aⅴ| 精品电影一区| 日本xxxxxxxxx18| 91精品国产综合久久精品性色 | re久久精品视频| 99久久99精品| 欧美性色19p| 麻豆传媒在线免费看| 国产日韩欧美一区二区三区四区| 日韩成人午夜精品| 精品少妇theporn| 欲色天天网综合久久|