久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Nodejs入门【转载】保留备用

發布時間:2024/9/5 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nodejs入门【转载】保留备用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于

本書致力于教會你如何用Node.js來開發應用,過程中會傳授你所有所需的“高級”JavaScript知識。本書絕不是一本“Hello World”的教程。

狀態

你正在閱讀的已經是本書的最終版。因此,只有當進行錯誤更正以及針對新版本Node.js的改動進行對應的修正時,才會進行更新。

本書中的代碼案例都在Node.js 0.6.11版本中測試過,可以正確工作。

讀者對象

本書最適合與我有相似技術背景的讀者: 至少對一門諸如Ruby、Python、PHP或者Java這樣面向對象的語言有一定的經驗;對JavaScript處于初學階段,并且完全是一個Node.js的新手。

這里指的適合對其他編程語言有一定經驗的開發者,意思是說,本書不會對諸如數據類型、變量、控制結構等等之類非常基礎的概念作介紹。要讀懂本書,這些基礎的概念我都默認你已經會了。

然而,本書還是會對JavaScript中的函數和對象作詳細介紹,因為它們與其他同類編程語言中的函數和對象有很大的不同。

本書結構

讀完本書之后,你將完成一個完整的web應用,該應用允許用戶瀏覽頁面以及上傳文件。

當然了,應用本身并沒有什么了不起的,相比為了實現該功能書寫的代碼本身,我們更關注的是如何創建一個框架來對我們應用的不同模塊進行干凈地剝離。 是不是很玄乎?稍后你就明白了。

本書先從介紹在Node.js環境中進行JavaScript開發和在瀏覽器環境中進行JavaScript開發的差異開始。

緊接著,會帶領大家完成一個最傳統的“Hello World”應用,這也是最基礎的Node.js應用。

最后,會和大家討論如何設計一個“真正”完整的應用,剖析要完成該應用需要實現的不同模塊,并一步一步介紹如何來實現這些模塊。

可以確保的是,在這過程中,大家會學到JavaScript中一些高級的概念、如何使用它們以及為什么使用這些概念就可以實現而其他編程語言中同類的概念就無法實現。

該應用所有的源代碼都可以通過?本書Github代碼倉庫.

目錄
  • 關于
    • 狀態
    • 讀者對象
    • 本書結構
  • JavaScript與Node.js
    • JavaScript與你
    • 簡短申明
    • 服務器端JavaScript
    • “Hello World”
  • 一個完整的基于Node.js的web應用
    • 用例
    • 應用不同模塊分析
  • 構建應用的模塊
    • 一個基礎的HTTP服務器
    • 分析HTTP服務器
    • 進行函數傳遞
    • 函數傳遞是如何讓HTTP服務器工作的
    • 基于事件驅動的回調
    • 服務器是如何處理請求的
    • 服務端的模塊放在哪里
    • 如何來進行請求的“路由”
    • 行為驅動執行
    • 路由給真正的請求處理程序
    • 讓請求處理程序作出響應
      • 不好的實現方式
      • 阻塞與非阻塞
      • 以非阻塞操作進行請求響應
    • 更有用的場景
      • 處理POST請求
      • 處理文件上傳
    • 總結與展望

JavaScript與Node.js

JavaScript與你

拋開技術,我們先來聊聊你以及你和JavaScript的關系。本章的主要目的是想讓你看看,對你而言是否有必要繼續閱讀后續章節的內容。

如果你和我一樣,那么你很早就開始利用HTML進行“開發”,正因如此,你接觸到了這個叫JavaScript有趣的東西,而對于JavaScript,你只會基本的操作——為web頁面添加交互。

而你真正想要的是“干貨”,你想要知道如何構建復雜的web站點 —— 于是,你學習了一種諸如PHP、Ruby、Java這樣的編程語言,并開始書寫“后端”代碼。

與此同時,你還始終關注著JavaScript,隨著通過一些對jQuery,Prototype之類技術的介紹,你慢慢了解到了很多JavaScript中的進階技能,同時也感受到了JavaScript絕非僅僅是window.open()?那么簡單。 .

不過,這些畢竟都是前端技術,盡管當想要增強頁面的時候,使用jQuery總讓你覺得很爽,但到最后,你頂多是個JavaScript用戶,而非JavaScript開發者。

然后,出現了Node.js,服務端的JavaScript,這有多酷啊?

于是,你覺得是時候該重新拾起既熟悉又陌生的JavaScript了。但是別急,寫Node.js應用是一件事情;理解為什么它們要以它們書寫的這種方式來書寫則意味著——你要懂JavaScript。這次是玩真的了。

問題來了: 由于JavaScript真正意義上以兩種,甚至可以說是三種形態存在(從中世紀90年代的作為對DHTML進行增強的小玩具,到像jQuery那樣嚴格意義上的前端技術,一直到現在的服務端技術),因此,很難找到一個“正確”的方式來學習JavaScript,使得讓你書寫Node.js應用的時候感覺自己是在真正開發它而不僅僅是使用它。

因為這就是關鍵: 你本身已經是個有經驗的開發者,你不想通過到處尋找各種解決方案(其中可能還有不正確的)來學習新的技術,你要確保自己是通過正確的方式來學習這項技術。

當然了,外面不乏很優秀的學習JavaScript的文章。但是,有的時候光靠那些文章是遠遠不夠的。你需要的是指導。

本書的目標就是給你提供指導。

簡短申明

業界有非常優秀的JavaScript程序員。而我并非其中一員。

我就是上一節中描述的那個我。我熟悉如何開發后端web應用,但是對“真正”的JavaScript以及Node.js,我都只是新手。我也只是最近學習了一些JavaScript的高級概念,并沒有實踐經驗。

因此,本書并不是一本“從入門到精通”的書,更像是一本“從初級入門到高級入門”的書。

如果成功的話,那么本書就是我當初開始學習Node.js最希望擁有的教程。

服務端JavaScript

JavaScript最早是運行在瀏覽器中,然而瀏覽器只是提供了一個上下文,它定義了使用JavaScript可以做什么,但并沒有“說”太多關于JavaScript語言本身可以做什么。事實上,JavaScript是一門“完整”的語言: 它可以使用在不同的上下文中,其能力與其他同類語言相比有過之而無不及。

Node.js事實上就是另外一種上下文,它允許在后端(脫離瀏覽器環境)運行JavaScript代碼。

要實現在后臺運行JavaScript代碼,代碼需要先被解釋然后正確的執行。Node.js的原理正是如此,它使用了Google的V8虛擬機(Google的Chrome瀏覽器使用的JavaScript執行環境),來解釋和執行JavaScript代碼。

除此之外,伴隨著Node.js的還有許多有用的模塊,它們可以簡化很多重復的勞作,比如向終端輸出字符串。

因此,Node.js事實上既是一個運行時環境,同時又是一個庫。

要使用Node.js,首先需要進行安裝。關于如何安裝Node.js,這里就不贅述了,可以直接參考官方的安裝指南。安裝完成后,繼續回來閱讀本書下面的內容。

“Hello World”

好了,“廢話”不多說了,馬上開始我們第一個Node.js應用:“Hello World”。

打開你最喜歡的編輯器,創建一個helloworld.js文件。我們要做就是向STDOUT輸出“Hello World”,如下是實現該功能的代碼:

console.log("Hello World");

保存該文件,并通過Node.js來執行:

node helloworld.js

正常的話,就會在終端輸出Hello World?。

好吧,我承認這個應用是有點無趣,那么下面我們就來點“干貨”。

一個完整的基于Node.js的web應用

用例

我們來把目標設定得簡單點,不過也要夠實際才行:

  • 用戶可以通過瀏覽器使用我們的應用。
  • 當用戶請求http://domain/start時,可以看到一個歡迎頁面,頁面上有一個文件上傳的表單。
  • 用戶可以選擇一個圖片并提交表單,隨后文件將被上傳到http://domain/upload,該頁面完成上傳后會把圖片顯示在頁面上。

差不多了,你現在也可以去Google一下,找點東西亂搞一下來完成功能。但是我們現在先不做這個。

更進一步地說,在完成這一目標的過程中,我們不僅僅需要基礎的代碼而不管代碼是否優雅。我們還要對此進行抽象,來尋找一種適合構建更為復雜的Node.js應用的方式。

應用不同模塊分析

我們來分解一下這個應用,為了實現上文的用例,我們需要實現哪些部分呢?

  • 我們需要提供Web頁面,因此需要一個HTTP服務器
  • 對于不同的請求,根據請求的URL,我們的服務器需要給予不同的響應,因此我們需要一個路由,用于把請求對應到請求處理程序(request handler)
  • 當請求被服務器接收并通過路由傳遞之后,需要可以對其進行處理,因此我們需要最終的請求處理程序
  • 路由還應該能處理POST數據,并且把數據封裝成更友好的格式傳遞給請求處理入程序,因此需要請求數據處理功能
  • 我們不僅僅要處理URL對應的請求,還要把內容顯示出來,這意味著我們需要一些視圖邏輯供請求處理程序使用,以便將內容發送給用戶的瀏覽器
  • 最后,用戶需要上傳圖片,所以我們需要上傳處理功能來處理這方面的細節

我們先來想想,使用PHP的話我們會怎么構建這個結構。一般來說我們會用一個Apache HTTP服務器并配上mod_php5模塊。
從這個角度看,整個“接收HTTP請求并提供Web頁面”的需求根本不需要PHP來處理。

不過對Node.js來說,概念完全不一樣了。使用Node.js時,我們不僅僅在實現一個應用,同時還實現了整個HTTP服務器。事實上,我們的Web應用以及對應的Web服務器基本上是一樣的。

聽起來好像有一大堆活要做,但隨后我們會逐漸意識到,對Node.js來說這并不是什么麻煩的事。

現在我們就來開始實現之路,先從第一個部分--HTTP服務器著手。

構建應用的模塊

一個基礎的HTTP服務器

當我準備開始寫我的第一個“真正的”Node.js應用的時候,我不但不知道怎么寫Node.js代碼,也不知道怎么組織這些代碼。?
我應該把所有東西都放進一個文件里嗎?網上有很多教程都會教你把所有的邏輯都放進一個用Node.js寫的基礎HTTP服務器里。但是如果我想加入更多的內容,同時還想保持代碼的可讀性呢?

實際上,只要把不同功能的代碼放入不同的模塊中,保持代碼分離還是相當簡單的。

這種方法允許你擁有一個干凈的主文件(main file),你可以用Node.js執行它;同時你可以擁有干凈的模塊,它們可以被主文件和其他的模塊調用。

那么,現在我們來創建一個用于啟動我們的應用的主文件,和一個保存著我們的HTTP服務器代碼的模塊。

在我的印象里,把主文件叫做index.js或多或少是個標準格式。把服務器模塊放進叫server.js的文件里則很好理解。

讓我們先從服務器模塊開始。在你的項目的根目錄下創建一個叫server.js的文件,并寫入以下代碼:

var http = require("http");http.createServer(function(request, response) {response.writeHead(200, {"Content-Type": "text/plain"});response.write("Hello World");response.end(); }).listen(8888);

搞定!你剛剛完成了一個可以工作的HTTP服務器。為了證明這一點,我們來運行并且測試這段代碼。首先,用Node.js執行你的腳本:

node server.js

接下來,打開瀏覽器訪問http://localhost:8888/,你會看到一個寫著“Hello World”的網頁。

這很有趣,不是嗎?讓我們先來談談HTTP服務器的問題,把如何組織項目的事情先放一邊吧,你覺得如何?我保證之后我們會解決那個問題的。

分析HTTP服務器

那么接下來,讓我們分析一下這個HTTP服務器的構成。

第一行請求(require)Node.js自帶的?http?模塊,并且把它賦值給?http?變量。

接下來我們調用http模塊提供的函數:?createServer?。這個函數會返回一個對象,這個對象有一個叫做?listen?的方法,這個方法有一個數值參數,指定這個HTTP服務器監聽的端口號。

咱們暫時先不管?http.createServer?的括號里的那個函數定義。

我們本來可以用這樣的代碼來啟動服務器并偵聽8888端口:

var http = require("http");

var server = http.createServer();
server
.listen(8888);

這段代碼只會啟動一個偵聽8888端口的服務器,它不做任何別的事情,甚至連請求都不會應答。

最有趣(而且,如果你之前習慣使用一個更加保守的語言,比如PHP,它還很奇怪)的部分是?createSever()?的第一個參數,一個函數定義。

實際上,這個函數定義是?createServer()?的第一個也是唯一一個參數。因為在JavaScript中,函數和其他變量一樣都是可以被傳遞的。

進行函數傳遞

舉例來說,你可以這樣做:

function say(word){
? console
.log(word);
}

function execute(someFunction, value){
? someFunction
(value);
}

execute
(say,"Hello");

請仔細閱讀這段代碼!在這里,我們把?say?函數作為execute函數的第一個變量進行了傳遞。這里返回的不是?say?的返回值,而是?say?本身!

這樣一來,?say?就變成了execute?中的本地變量?someFunction?,execute可以通過調用?someFunction()?(帶括號的形式)來使用?say?函數。

當然,因為?say?有一個變量,?execute?在調用?someFunction?時可以傳遞這樣一個變量。

我們可以,就像剛才那樣,用它的名字把一個函數作為變量傳遞。但是我們不一定要繞這個“先定義,再傳遞”的圈子,我們可以直接在另一個函數的括號中定義和傳遞這個函數:

function execute(someFunction, value){someFunction(value); }execute(function(word){ console.log(word)},"Hello");

我們在?execute?接受第一個參數的地方直接定義了我們準備傳遞給?execute?的函數。

用這種方式,我們甚至不用給這個函數起名字,這也是為什么它被叫做?匿名函數。

這是我們和我所認為的“進階”JavaScript的第一次親密接觸,不過我們還是得循序漸進。現在,我們先接受這一點:在JavaScript中,一個函數可以作為另一個函數接收一個參數。我們可以先定義一個函數,然后傳遞,也可以在傳遞參數的地方直接定義函數。

函數傳遞是如何讓HTTP服務器工作的

帶著這些知識,我們再來看看我們簡約而不簡單的HTTP服務器:

var http = require("http");http.createServer(function(request, response){response.writeHead(200,{"Content-Type":"text/plain"});response.write("Hello World");response.end(); }).listen(8888);

現在它看上去應該清晰了很多:我們向?createServer?函數傳遞了一個匿名函數。

用這樣的代碼也可以達到同樣的目的:

var http = require("http");function onRequest(request, response){response.writeHead(200,{"Content-Type":"text/plain"});response.write("Hello World");response.end(); }http.createServer(onRequest).listen(8888);

也許現在我們該問這個問題了:我們為什么要用這種方式呢?

?

基于事件驅動的回調

?

這個問題可不好回答(至少對我來說),不過這是Node.js原生的工作方式。它是事件驅動的,這也是它為什么這么快的原因。

?

你也許會想花點時間讀一下Felix Geisend?rfer的大作Understanding node.js,它介紹了一些背景知識。

?

這一切都歸結于“Node.js是事件驅動的”這一事實。好吧,其實我也不是特別確切的了解這句話的意思。不過我會試著解釋,為什么它對我們用Node.js寫網絡應用(Web based application)是有意義的。

?

當我們使用?http.createServer?方法的時候,我們當然不只是想要一個偵聽某個端口的服務器,我們還想要它在服務器收到一個HTTP請求的時候做點什么。

?

問題是,這是異步的:請求任何時候都可能到達,但是我們的服務器卻跑在一個單進程中。

?

寫PHP應用的時候,我們一點也不為此擔心:任何時候當有請求進入的時候,網頁服務器(通常是Apache)就為這一請求新建一個進程,并且開始從頭到尾執行相應的PHP腳本。

?

那么在我們的Node.js程序中,當一個新的請求到達8888端口的時候,我們怎么控制流程呢?

?

嗯,這就是Node.js/JavaScript的事件驅動設計能夠真正幫上忙的地方了——雖然我們還得學一些新概念才能掌握它。讓我們來看看這些概念是怎么應用在我們的服務器代碼里的。

?

我們創建了服務器,并且向創建它的方法傳遞了一個函數。無論何時我們的服務器收到一個請求,這個函數就會被調用。

?

我們不知道這件事情什么時候會發生,但是我們現在有了一個處理請求的地方:它就是我們傳遞過去的那個函數。至于它是被預先定義的函數還是匿名函數,就無關緊要了。

?

這個就是傳說中的?回調?。我們給某個方法傳遞了一個函數,這個方法在有相應事件發生時調用這個函數來進行?回調?。

?

至少對我來說,需要一些功夫才能弄懂它。你如果還是不太確定的話就再去讀讀Felix的博客文章。

?

讓我們再來琢磨琢磨這個新概念。我們怎么證明,在創建完服務器之后,即使沒有HTTP請求進來、我們的回調函數也沒有被調用的情況下,我們的代碼還繼續有效呢?我們試試這個:

?

var http = require("http");function onRequest(request, response){console.log("Request received.");response.writeHead(200,{"Content-Type":"text/plain"});response.write("Hello World");response.end(); }http.createServer(onRequest).listen(8888);console.log("Server has started.");

注意:在?onRequest?(我們的回調函數)觸發的地方,我用?console.log?輸出了一段文本。在HTTP服務器開始工作之后,也輸出一段文本。

?

當我們與往常一樣,運行它node server.js時,它會馬上在命令行上輸出“Server has started.”。當我們向服務器發出請求(在瀏覽器訪問http://localhost:8888/),“Request received.”這條消息就會在命令行中出現。

?

這就是事件驅動的異步服務器端JavaScript和它的回調啦!

?

(請注意,當我們在服務器訪問網頁時,我們的服務器可能會輸出兩次“Request received.”。那是因為大部分服務器都會在你訪問 http://localhost:8888 /時嘗試讀取 http://localhost:8888/favicon.ico )

?

?

服務器是如何處理請求的

?

好的,接下來我們簡單分析一下我們服務器代碼中剩下的部分,也就是我們的回調函數?onRequest()?的主體部分。

?

當回調啟動,我們的?onRequest()?函數被觸發的時候,有兩個參數被傳入:request?和?response?。

?

它們是對象,你可以使用它們的方法來處理HTTP請求的細節,并且響應請求(比如向發出請求的瀏覽器發回一些東西)。

?

所以我們的代碼就是:當收到請求時,使用?response.writeHead()?函數發送一個HTTP狀態200和HTTP頭的內容類型(content-type),使用?response.write()?函數在HTTP相應主體中發送文本“Hello World"。

?

最后,我們調用?response.end()?完成響應。

?

目前來說,我們對請求的細節并不在意,所以我們沒有使用?request?對象。

服務端的模塊放在哪里

?

OK,就像我保證過的那樣,我們現在可以回到我們如何組織應用這個問題上了。我們現在在?server.js?文件中有一個非常基礎的HTTP服務器代碼,而且我提到通常我們會有一個叫?index.js?的文件去調用應用的其他模塊(比如?server.js?中的HTTP服務器模塊)來引導和啟動應用。

?

我們現在就來談談怎么把server.js變成一個真正的Node.js模塊,使它可以被我們(還沒動工)的?index.js?主文件使用。

?

也許你已經注意到,我們已經在代碼中使用了模塊了。像這樣:

?

var http = require("http");

...

http
.createServer(...);

?

Node.js中自帶了一個叫做“http”的模塊,我們在我們的代碼中請求它并把返回值賦給一個本地變量。

?

這把我們的本地變量變成了一個擁有所有?http?模塊所提供的公共方法的對象。

?

給這種本地變量起一個和模塊名稱一樣的名字是一種慣例,但是你也可以按照自己的喜好來:

?

var foo = require("http");

...

foo
.createServer(...);

?

很好,怎么使用Node.js內部模塊已經很清楚了。我們怎么創建自己的模塊,又怎么使用它呢?

?

等我們把?server.js?變成一個真正的模塊,你就能搞明白了。

?

事實上,我們不用做太多的修改。把某段代碼變成模塊意味著我們需要把我們希望提供其功能的部分?導出?到請求這個模塊的腳本。

?

目前,我們的HTTP服務器需要導出的功能非常簡單,因為請求服務器模塊的腳本僅僅是需要啟動服務器而已。

?

我們把我們的服務器腳本放到一個叫做?start?的函數里,然后我們會導出這個函數。

?

var http = require("http");function start(){function onRequest(request, response){console.log("Request received.");response.writeHead(200,{"Content-Type":"text/plain"});response.write("Hello World");response.end();}http.createServer(onRequest).listen(8888);console.log("Server has started."); }exports.start = start;

這樣,我們現在就可以創建我們的主文件?index.js?并在其中啟動我們的HTTP了,雖然服務器的代碼還在?server.js?中。

?

創建?index.js?文件并寫入以下內容:

?

var server = require("./server");

server
.start();

?

正如你所看到的,我們可以像使用任何其他的內置模塊一樣使用server模塊:請求這個文件并把它指向一個變量,其中已導出的函數就可以被我們使用了。

?

好了。我們現在就可以從我們的主要腳本啟動我們的的應用了,而它還是老樣子:

?

node index.js

?

非常好,我們現在可以把我們的應用的不同部分放入不同的文件里,并且通過生成模塊的方式把它們連接到一起了。

?

我們仍然只擁有整個應用的最初部分:我們可以接收HTTP請求。但是我們得做點什么——對于不同的URL請求,服務器應該有不同的反應。

?

對于一個非常簡單的應用來說,你可以直接在回調函數?onRequest()?中做這件事情。不過就像我說過的,我們應該加入一些抽象的元素,讓我們的例子變得更有趣一點兒。

?

處理不同的HTTP請求在我們的代碼中是一個不同的部分,叫做“路由選擇”——那么,我們接下來就創造一個叫做?路由?的模塊吧。

?

?

如何來進行請求的“路由”

?

我們要為路由提供請求的URL和其他需要的GET及POST參數,隨后路由需要根據這些數據來執行相應的代碼(這里“代碼”對應整個應用的第三部分:一系列在接收到請求時真正工作的處理程序)。

?

因此,我們需要查看HTTP請求,從中提取出請求的URL以及GET/POST參數。這一功能應當屬于路由還是服務器(甚至作為一個模塊自身的功能)確實值得探討,但這里暫定其為我們的HTTP服務器的功能。

?

我們需要的所有數據都會包含在request對象中,該對象作為onRequest()回調函數的第一個參數傳遞。但是為了解析這些數據,我們需要額外的Node.JS模塊,它們分別是url和querystring模塊。

?

url.parse(string).query|url.parse(string).pathname || || |------ ------------------- http://localhost:8888/start?foo=bar&hello=world --- -----| || |querystring(string)["foo"] ||querystring(string)["hello"]

當然我們也可以用querystring模塊來解析POST請求體中的參數,稍后會有演示。

?

現在我們來給onRequest()函數加上一些邏輯,用來找出瀏覽器請求的URL路徑:

?

var http = require("http"); var url = require("url");function start(){function onRequest(request, response){var pathname = url.parse(request.url).pathname;console.log("Request for "+ pathname +" received.");response.writeHead(200,{"Content-Type":"text/plain"});response.write("Hello World");response.end();}http.createServer(onRequest).listen(8888);console.log("Server has started."); }exports.start = start;

好了,我們的應用現在可以通過請求的URL路徑來區別不同請求了--這使我們得以使用路由(還未完成)來將請求以URL路徑為基準映射到處理程序上。

?

在我們所要構建的應用中,這意味著來自/start和/upload的請求可以使用不同的代碼來處理。稍后我們將看到這些內容是如何整合到一起的。

?

現在我們可以來編寫路由了,建立一個名為router.js的文件,添加以下內容:

?

function route(pathname){console.log("About to route a request for "+ pathname); }exports.route = route;

如你所見,這段代碼什么也沒干,不過對于現在來說這是應該的。在添加更多的邏輯以前,我們先來看看如何把路由和服務器整合起來。

?

我們的服務器應當知道路由的存在并加以有效利用。我們當然可以通過硬編碼的方式將這一依賴項綁定到服務器上,但是其它語言的編程經驗告訴我們這會是一件非常痛苦的事,因此我們將使用依賴注入的方式較松散地添加路由模塊(你可以讀讀Martin Fowlers關于依賴注入的大作來作為背景知識)。

?

首先,我們來擴展一下服務器的start()函數,以便將路由函數作為參數傳遞過去:

?

var http = require("http"); var url = require("url");function start(route){function onRequest(request, response){var pathname = url.parse(request.url).pathname;console.log("Request for "+ pathname +" received.");route(pathname);response.writeHead(200,{"Content-Type":"text/plain"});response.write("Hello World");response.end();}http.createServer(onRequest).listen(8888);console.log("Server has started."); }exports.start = start;

同時,我們會相應擴展index.js,使得路由函數可以被注入到服務器中:

?

var server = require("./server"); var router = require("./router");server.start(router.route); 在這里,我們傳遞的函數依舊什么也沒做。

?

如果現在啟動應用(node index.js,始終記得這個命令行),隨后請求一個URL,你將會看到應用輸出相應的信息,這表明我們的HTTP服務器已經在使用路由模塊了,并會將請求的路徑傳遞給路由:

?

bash$ node index.js Request for /foo received. About to route a request for /foo

?

(以上輸出已經去掉了比較煩人的/favicon.ico請求相關的部分)。

?

?

行為驅動執行

?

請允許我再次脫離主題,在這里談一談函數式編程。

?

將函數作為參數傳遞并不僅僅出于技術上的考量。對軟件設計來說,這其實是個哲學問題。想想這樣的場景:在index文件中,我們可以將router對象傳遞進去,服務器隨后可以調用這個對象的route函數。

?

就像這樣,我們傳遞一個東西,然后服務器利用這個東西來完成一些事。嗨那個叫路由的東西,能幫我把這個路由一下嗎?

?

但是服務器其實不需要這樣的東西。它只需要把事情做完就行,其實為了把事情做完,你根本不需要東西,你需要的是動作。也就是說,你不需要名詞,你需要動詞。

?

理解了這個概念里最核心、最基本的思想轉換后,我自然而然地理解了函數編程。

?

我是在讀了Steve Yegge的大作名詞王國中的死刑之后理解函數編程。你也去讀一讀這本書吧,真的。這是曾給予我閱讀的快樂的關于軟件的書籍之一。

路由給真正的請求處理程序

?

回到正題,現在我們的HTTP服務器和請求路由模塊已經如我們的期望,可以相互交流了,就像一對親密無間的兄弟。

?

當然這還遠遠不夠,路由,顧名思義,是指我們要針對不同的URL有不同的處理方式。例如處理/start的“業務邏輯”就應該和處理/upload的不同。

?

在現在的實現下,路由過程會在路由模塊中“結束”,并且路由模塊并不是真正針對請求“采取行動”的模塊,否則當我們的應用程序變得更為復雜時,將無法很好地擴展。

?

我們暫時把作為路由目標的函數稱為請求處理程序。現在我們不要急著來開發路由模塊,因為如果請求處理程序沒有就緒的話,再怎么完善路由模塊也沒有多大意義。

?

應用程序需要新的部件,因此加入新的模塊 -- 已經無需為此感到新奇了。我們來創建一個叫做requestHandlers的模塊,并對于每一個請求處理程序,添加一個占位用函數,隨后將這些函數作為模塊的方法導出:

?

function start(){console.log("Request handler 'start' was called."); }function upload(){console.log("Request handler 'upload' was called."); }exports.start = start; exports.upload = upload;

這樣我們就可以把請求處理程序和路由模塊連接起來,讓路由“有路可尋”。

?

在這里我們得做個決定:是將requestHandlers模塊硬編碼到路由里來使用,還是再添加一點依賴注入?雖然和其他模式一樣,依賴注入不應該僅僅為使用而使用,但在現在這個情況下,使用依賴注入可以讓路由和請求處理程序之間的耦合更加松散,也因此能讓路由的重用性更高。

?

這意味著我們得將請求處理程序從服務器傳遞到路由中,但感覺上這么做更離譜了,我們得一路把這堆請求處理程序從我們的主文件傳遞到服務器中,再將之從服務器傳遞到路由。

?

那么我們要怎么傳遞這些請求處理程序呢?別看現在我們只有2個處理程序,在一個真實的應用中,請求處理程序的數量會不斷增加,我們當然不想每次有一個新的URL或請求處理程序時,都要為了在路由里完成請求到處理程序的映射而反復折騰。除此之外,在路由里有一大堆if request == x then call handler y也使得系統丑陋不堪。

?

仔細想想,有一大堆東西,每個都要映射到一個字符串(就是請求的URL)上?似乎關聯數組(associative array)能完美勝任。

?

不過結果有點令人失望,JavaScript沒提供關聯數組 -- 也可以說它提供了?事實上,在JavaScript中,真正能提供此類功能的是它的對象。

?

在這方面,http://msdn.microsoft.com/en-us/magazine/cc163419.aspx有一個不錯的介紹,我在此摘錄一段:

?

在C++或C#中,當我們談到對象,指的是類或者結構體的實例。對象根據他們實例化的模板(就是所謂的類),會擁有不同的屬性和方法。但在JavaScript里對象不是這個概念。在JavaScript中,對象就是一個鍵/值對的集合 -- 你可以把JavaScript的對象想象成一個鍵為字符串類型的字典。

?

但如果JavaScript的對象僅僅是鍵/值對的集合,它又怎么會擁有方法呢?好吧,這里的值可以是字符串、數字或者……函數!

?

好了,最后再回到代碼上來。現在我們已經確定將一系列請求處理程序通過一個對象來傳遞,并且需要使用松耦合的方式將這個對象注入到route()函數中。

?

我們先將這個對象引入到主文件index.js中:

?

var server = require("./server"); var router = require("./router"); var requestHandlers = require("./requestHandlers");var handle ={} handle["/"]= requestHandlers.start; handle["/start"]= requestHandlers.start; handle["/upload"]= requestHandlers.upload;server.start(router.route, handle);

雖然handle并不僅僅是一個“東西”(一些請求處理程序的集合),我還是建議以一個動詞作為其命名,這樣做可以讓我們在路由中使用更流暢的表達式,稍后會有說明。

?

正如所見,將不同的URL映射到相同的請求處理程序上是很容易的:只要在對象中添加一個鍵為"/"的屬性,對應requestHandlers.start即可,這樣我們就可以干凈簡潔地配置/start和/的請求都交由start這一處理程序處理。

?

在完成了對象的定義后,我們把它作為額外的參數傳遞給服務器,為此將server.js修改如下:

?

var http = require("http"); var url = require("url");function start(route, handle){function onRequest(request, response){var pathname = url.parse(request.url).pathname;console.log("Request for "+ pathname +" received.");route(handle, pathname);response.writeHead(200,{"Content-Type":"text/plain"});response.write("Hello World");response.end();}http.createServer(onRequest).listen(8888);console.log("Server has started."); }exports.start = start;

這樣我們就在start()函數里添加了handle參數,并且把handle對象作為第一個參數傳遞給了route()回調函數。

?

然后我們相應地在route.js文件中修改route()函數:

?

function route(handle, pathname){console.log("About to route a request for "+ pathname);if(typeof handle[pathname]==='function'){handle[pathname]();}else{console.log("No request handler found for "+ pathname);} }exports.route = route;

通過以上代碼,我們首先檢查給定的路徑對應的請求處理程序是否存在,如果存在的話直接調用相應的函數。我們可以用從關聯數組中獲取元素一樣的方式從傳遞的對象中獲取請求處理函數,因此就有了簡潔流暢的形如handle[pathname]();的表達式,這個感覺就像在前方中提到的那樣:“嗨,請幫我處理了這個路徑”。

?

有了這些,我們就把服務器、路由和請求處理程序在一起了。現在我們啟動應用程序并在瀏覽器中訪問http://localhost:8888/start,以下日志可以說明系統調用了正確的請求處理程序:

?

Server has started. Request for /start received. About to route a request for /start Request handler 'start' was called.

?

并且在瀏覽器中打開http://localhost:8888/可以看到這個請求同樣被start請求處理程序處理了:

?

Request for / received. About to route a request for / Request handler 'start' was called.

?

讓請求處理程序作出響應

很好。不過現在要是請求處理程序能夠向瀏覽器返回一些有意義的信息而并非全是“Hello World”,那就更好了。

這里要記住的是,瀏覽器發出請求后獲得并顯示的“Hello World”信息仍是來自于我們server.js文件中的onRequest函數。

其實“處理請求”說白了就是“對請求作出響應”,因此,我們需要讓請求處理程序能夠像onRequest函數那樣可以和瀏覽器進行“對話”。

不好的實現方式

對于我們這樣擁有PHP或者Ruby技術背景的開發者來說,最直截了當的實現方式事實上并不是非常靠譜: 看似有效,實則未必如此。

這里我指的“直截了當的實現方式”意思是:讓請求處理程序通過onRequest函數直接返回(return())他們要展示給用戶的信息。

我們先就這樣去實現,然后再來看為什么這不是一種很好的實現方式。

讓我們從讓請求處理程序返回需要在瀏覽器中顯示的信息開始。我們需要將requestHandler.js修改為如下形式:

function start(){console.log("Request handler 'start' was called.");return"Hello Start"; }function upload(){console.log("Request handler 'upload' was called.");return"Hello Upload"; }exports.start = start; exports.upload = upload;

好的。同樣的,請求路由需要將請求處理程序返回給它的信息返回給服務器。因此,我們需要將router.js修改為如下形式:

function route(handle, pathname){console.log("About to route a request for "+ pathname);if(typeof handle[pathname]==='function'){return handle[pathname]();}else{console.log("No request handler found for "+ pathname);return"404 Not found";} }exports.route = route;

正如上述代碼所示,當請求無法路由的時候,我們也返回了一些相關的錯誤信息。

最后,我們需要對我們的server.js進行重構以使得它能夠將請求處理程序通過請求路由返回的內容響應給瀏覽器,如下所示:

var http = require("http"); var url = require("url");function start(route, handle){function onRequest(request, response){var pathname = url.parse(request.url).pathname;console.log("Request for "+ pathname +" received.");response.writeHead(200,{"Content-Type":"text/plain"});var content = route(handle, pathname)response.write(content);response.end();}http.createServer(onRequest).listen(8888);console.log("Server has started."); }exports.start = start;

如果我們運行重構后的應用,一切都會工作的很好:請求http://localhost:8888/start,瀏覽器會輸出“Hello Start”,請求http://localhost:8888/upload會輸出“Hello Upload”,而請求http://localhost:8888/foo?會輸出“404 Not found”。

好,那么問題在哪里呢?簡單的說就是: 當未來有請求處理程序需要進行非阻塞的操作的時候,我們的應用就“掛”了。

沒理解?沒關系,下面就來詳細解釋下。

阻塞與非阻塞

正如此前所提到的,當在請求處理程序中包括非阻塞操作時就會出問題。但是,在說這之前,我們先來看看什么是阻塞操作。

我不想去解釋“阻塞”和“非阻塞”的具體含義,我們直接來看,當在請求處理程序中加入阻塞操作時會發生什么。

這里,我們來修改下start請求處理程序,我們讓它等待10秒以后再返回“Hello Start”。因為,JavaScript中沒有類似sleep()這樣的操作,所以這里只能夠來點小Hack來模擬實現。

讓我們將requestHandlers.js修改成如下形式:

function start(){console.log("Request handler 'start' was called.");function sleep(milliSeconds){var startTime =newDate().getTime();while(newDate().getTime()< startTime + milliSeconds);}sleep(10000);return"Hello Start"; }function upload(){console.log("Request handler 'upload' was called.");return"Hello Upload"; }exports.start = start; exports.upload = upload;

上述代碼中,當函數start()被調用的時候,Node.js會先等待10秒,之后才會返回“Hello Start”。當調用upload()的時候,會和此前一樣立即返回。

(當然了,這里只是模擬休眠10秒,實際場景中,這樣的阻塞操作有很多,比方說一些長時間的計算操作等。)

接下來就讓我們來看看,我們的改動帶來了哪些變化。

如往常一樣,我們先要重啟下服務器。為了看到效果,我們要進行一些相對復雜的操作(跟著我一起做): 首先,打開兩個瀏覽器窗口或者標簽頁。在第一個瀏覽器窗口的地址欄中輸入http://localhost:8888/start, 但是先不要打開它!

在第二個瀏覽器窗口的地址欄中輸入http://localhost:8888/upload, 同樣的,先不要打開它!

接下來,做如下操作:在第一個窗口中(“/start”)按下回車,然后快速切換到第二個窗口中(“/upload”)按下回車。

注意,發生了什么: /start URL加載花了10秒,這和我們預期的一樣。但是,/upload URL居然也花了10秒,而它在對應的請求處理程序中并沒有類似于sleep()這樣的操作!

這到底是為什么呢?原因就是start()包含了阻塞操作。形象的說就是“它阻塞了所有其他的處理工作”。

這顯然是個問題,因為Node一向是這樣來標榜自己的:“在node中除了代碼,所有一切都是并行執行的”。

這句話的意思是說,Node.js可以在不新增額外線程的情況下,依然可以對任務進行并行處理 —— Node.js是單線程的。它通過事件輪詢(event loop)來實現并行操作,對此,我們應該要充分利用這一點 —— 盡可能的避免阻塞操作,取而代之,多使用非阻塞操作。

然而,要用非阻塞操作,我們需要使用回調,通過將函數作為參數傳遞給其他需要花時間做處理的函數(比方說,休眠10秒,或者查詢數據庫,又或者是進行大量的計算)。

對于Node.js來說,它是這樣處理的:“嘿,probablyExpensiveFunction()(譯者注:這里指的就是需要花時間處理的函數),你繼續處理你的事情,我(Node.js線程)先不等你了,我繼續去處理你后面的代碼,請你提供一個callbackFunction(),等你處理完之后我會去調用該回調函數的,謝謝!”

(如果想要了解更多關于事件輪詢細節,可以閱讀Mixu的博文——理解node.js的事件輪詢。)

接下來,我們會介紹一種錯誤的使用非阻塞操作的方式。

和上次一樣,我們通過修改我們的應用來暴露問題。

這次我們還是拿start請求處理程序來“開刀”。將其修改成如下形式:

var exec = require("child_process").exec;function start(){console.log("Request handler 'start' was called.");var content ="empty";exec("ls -lah",function(error, stdout, stderr){content = stdout;});return content; }function upload(){console.log("Request handler 'upload' was called.");return"Hello Upload"; }exports.start = start; exports.upload = upload;

上述代碼中,我們引入了一個新的Node.js模塊,child_process。之所以用它,是為了實現一個既簡單又實用的非阻塞操作:exec()。

exec()做了什么呢?它從Node.js來執行一個shell命令。在上述例子中,我們用它來獲取當前目錄下所有的文件(“ls -lah”),然后,當/startURL請求的時候將文件信息輸出到瀏覽器中。

上述代碼是非常直觀的: 創建了一個新的變量content(初始值為“empty”),執行“ls -lah”命令,將結果賦值給content,最后將content返回。

和往常一樣,我們啟動服務器,然后訪問“http://localhost:8888/start” 。

之后會載入一個漂亮的web頁面,其內容為“empty”。怎么回事?

這個時候,你可能大致已經猜到了,exec()在非阻塞這塊發揮了神奇的功效。它其實是個很好的東西,有了它,我們可以執行非常耗時的shell操作而無需迫使我們的應用停下來等待該操作。

(如果想要證明這一點,可以將“ls -lah”換成比如“find /”這樣更耗時的操作來效果)。

然而,針對瀏覽器顯示的結果來看,我們并不滿意我們的非阻塞操作,對吧?

好,接下來,我們來修正這個問題。在這過程中,讓我們先來看看為什么當前的這種方式不起作用。

問題就在于,為了進行非阻塞工作,exec()使用了回調函數。

在我們的例子中,該回調函數就是作為第二個參數傳遞給exec()的匿名函數:

function(error, stdout, stderr){
? content
= stdout;
}

現在就到了問題根源所在了:我們的代碼是同步執行的,這就意味著在調用exec()之后,Node.js會立即執行?return content?;在這個時候,content仍然是“empty”,因為傳遞給exec()的回調函數還未執行到——因為exec()的操作是異步的。

我們這里“ls -lah”的操作其實是非常快的(除非當前目錄下有上百萬個文件)。這也是為什么回調函數也會很快的執行到 —— 不過,不管怎么說它還是異步的。

為了讓效果更加明顯,我們想象一個更耗時的命令: “find /”,它在我機器上需要執行1分鐘左右的時間,然而,盡管在請求處理程序中,我把“ls -lah”換成“find /”,當打開/start URL的時候,依然能夠立即獲得HTTP響應 —— 很明顯,當exec()在后臺執行的時候,Node.js自身會繼續執行后面的代碼。并且我們這里假設傳遞給exec()的回調函數,只會在“find /”命令執行完成之后才會被調用。

那究竟我們要如何才能實現將當前目錄下的文件列表顯示給用戶呢?

好,了解了這種不好的實現方式之后,我們接下來來介紹如何以正確的方式讓請求處理程序對瀏覽器請求作出響應。

以非阻塞操作進行請求響應

我剛剛提到了這樣一個短語 —— “正確的方式”。而事實上通常“正確的方式”一般都不簡單。

不過,用Node.js就有這樣一種實現方案: 函數傳遞。下面就讓我們來具體看看如何實現。

到目前為止,我們的應用已經可以通過應用各層之間傳遞值的方式(請求處理程序 -> 請求路由 -> 服務器)將請求處理程序返回的內容(請求處理程序最終要顯示給用戶的內容)傳遞給HTTP服務器。

現在我們采用如下這種新的實現方式:相對采用將內容傳遞給服務器的方式,我們這次采用將服務器“傳遞”給內容的方式。 從實踐角度來說,就是將response對象(從服務器的回調函數onRequest()獲取)通過請求路由傳遞給請求處理程序。 隨后,處理程序就可以采用該對象上的函數來對請求作出響應。

原理就是如此,接下來讓我們來一步步實現這種方案。

先從server.js開始:

var http = require("http"); var url = require("url");function start(route, handle){function onRequest(request, response){var pathname = url.parse(request.url).pathname;console.log("Request for "+ pathname +" received.");route(handle, pathname, response);}http.createServer(onRequest).listen(8888);console.log("Server has started."); }exports.start = start;

相對此前從route()函數獲取返回值的做法,這次我們將response對象作為第三個參數傳遞給route()函數,并且,我們將onRequest()處理程序中所有有關response的函數調都移除,因為我們希望這部分工作讓route()函數來完成。

下面就來看看我們的router.js:

function route(handle, pathname, response){console.log("About to route a request for "+ pathname);if(typeof handle[pathname]==='function'){handle[pathname](response);}else{console.log("No request handler found for "+ pathname);response.writeHead(404,{"Content-Type":"text/plain"});response.write("404 Not found");response.end();} }exports.route = route;

同樣的模式:相對此前從請求處理程序中獲取返回值,這次取而代之的是直接傳遞response對象。

如果沒有對應的請求處理器處理,我們就直接返回“404”錯誤。

最后,我們將requestHandler.js修改為如下形式:

var exec = require("child_process").exec;function start(response){console.log("Request handler 'start' was called.");exec("ls -lah",function(error, stdout, stderr){response.writeHead(200,{"Content-Type":"text/plain"});response.write(stdout);response.end();}); }function upload(response){console.log("Request handler 'upload' was called.");response.writeHead(200,{"Content-Type":"text/plain"});response.write("Hello Upload");response.end(); }exports.start = start; exports.upload = upload;

我們的處理程序函數需要接收response參數,為了對請求作出直接的響應。

start處理程序在exec()的匿名回調函數中做請求響應的操作,而upload處理程序仍然是簡單的回復“Hello World”,只是這次是使用response對象而已。

這時再次我們啟動應用(node index.js),一切都會工作的很好。

如果想要證明/start處理程序中耗時的操作不會阻塞對/upload請求作出立即響應的話,可以將requestHandlers.js修改為如下形式:

var exec = require("child_process").exec;function start(response){console.log("Request handler 'start' was called.");exec("find /",{ timeout:10000, maxBuffer:20000*1024},function(error, stdout, stderr){response.writeHead(200,{"Content-Type":"text/plain"});response.write(stdout);response.end();}); }function upload(response){console.log("Request handler 'upload' was called.");response.writeHead(200,{"Content-Type":"text/plain"});response.write("Hello Upload");response.end(); }exports.start = start; exports.upload = upload;

這樣一來,當請求http://localhost:8888/start的時候,會花10秒鐘的時間才載入,而當請求http://localhost:8888/upload的時候,會立即響應,縱然這個時候/start響應還在處理中。

更有用的場景

到目前為止,我們做的已經很好了,但是,我們的應用沒有實際用途。

服務器,請求路由以及請求處理程序都已經完成了,下面讓我們按照此前的用例給網站添加交互:用戶選擇一個文件,上傳該文件,然后在瀏覽器中看到上傳的文件。 為了保持簡單,我們假設用戶只會上傳圖片,然后我們應用將該圖片顯示到瀏覽器中。

好,下面就一步步來實現,鑒于此前已經對JavaScript原理性技術性的內容做過大量介紹了,這次我們加快點速度。

要實現該功能,分為如下兩步: 首先,讓我們來看看如何處理POST請求(非文件上傳),之后,我們使用Node.js的一個用于文件上傳的外部模塊。之所以采用這種實現方式有兩個理由。

第一,盡管在Node.js中處理基礎的POST請求相對比較簡單,但在這過程中還是能學到很多。?
第二,用Node.js來處理文件上傳(multipart POST請求)是比較復雜的,它不在本書的范疇,但,如何使用外部模塊卻是在本書涉獵內容之內。

處理POST請求

考慮這樣一個簡單的例子:我們顯示一個文本區(textarea)供用戶輸入內容,然后通過POST請求提交給服務器。最后,服務器接受到請求,通過處理程序將輸入的內容展示到瀏覽器中。

/start請求處理程序用于生成帶文本區的表單,因此,我們將requestHandlers.js修改為如下形式:

function start(response){console.log("Request handler 'start' was called.");var body ='<html>'+'<head>'+'<meta http-equiv="Content-Type" content="text/html; '+'charset=UTF-8" />'+'</head>'+'<body>'+'<form action="/upload" method="post">'+'<textarea name="text" rows="20" cols="60"></textarea>'+'<input type="submit" value="Submit text" />'+'</form>'+'</body>'+'</html>';response.writeHead(200,{"Content-Type":"text/html"});response.write(body);response.end(); }function upload(response){console.log("Request handler 'upload' was called.");response.writeHead(200,{"Content-Type":"text/plain"});response.write("Hello Upload");response.end(); }exports.start = start; exports.upload = upload;

好了,現在我們的應用已經很完善了,都可以獲得威比獎(Webby Awards)了,哈哈。(譯者注:威比獎是由國際數字藝術與科學學院主辦的評選全球最佳網站的獎項,具體參見詳細說明)通過在瀏覽器中訪問http://localhost:8888/start就可以看到簡單的表單了,要記得重啟服務器哦!

你可能會說:這種直接將視覺元素放在請求處理程序中的方式太丑陋了。說的沒錯,但是,我并不想在本書中介紹諸如MVC之類的模式,因為這對于你了解JavaScript或者Node.js環境來說沒多大關系。

余下的篇幅,我們來探討一個更有趣的問題: 當用戶提交表單時,觸發/upload請求處理程序處理POST請求的問題。

現在,我們已經是新手中的專家了,很自然會想到采用異步回調來實現非阻塞地處理POST請求的數據。

這里采用非阻塞方式處理是明智的,因為POST請求一般都比較“重” —— 用戶可能會輸入大量的內容。用阻塞的方式處理大數據量的請求必然會導致用戶操作的阻塞。

為了使整個過程非阻塞,Node.js會將POST數據拆分成很多小的數據塊,然后通過觸發特定的事件,將這些小數據塊傳遞給回調函數。這里的特定的事件有data事件(表示新的小數據塊到達了)以及end事件(表示所有的數據都已經接收完畢)。

我們需要告訴Node.js當這些事件觸發的時候,回調哪些函數。怎么告訴呢? 我們通過在request對象上注冊監聽器(listener) 來實現。這里的request對象是每次接收到HTTP請求時候,都會把該對象傳遞給onRequest回調函數。

如下所示:

request.addListener("data",function(chunk){
?
// called when a new chunk of data was received
});

request
.addListener("end",function(){
?
// called when all chunks of data have been received
});

問題來了,這部分邏輯寫在哪里呢? 我們現在只是在服務器中獲取到了request對象 —— 我們并沒有像之前response對象那樣,把 request 對象傳遞給請求路由和請求處理程序。

在我看來,獲取所有來自請求的數據,然后將這些數據給應用層處理,應該是HTTP服務器要做的事情。因此,我建議,我們直接在服務器中處理POST數據,然后將最終的數據傳遞給請求路由和請求處理器,讓他們來進行進一步的處理。

因此,實現思路就是: 將data和end事件的回調函數直接放在服務器中,在data事件回調中收集所有的POST數據,當接收到所有數據,觸發end事件后,其回調函數調用請求路由,并將數據傳遞給它,然后,請求路由再將該數據傳遞給請求處理程序。

還等什么,馬上來實現。先從server.js開始:

var http = require("http"); var url = require("url");function start(route, handle){function onRequest(request, response){var postData ="";var pathname = url.parse(request.url).pathname;console.log("Request for "+ pathname +" received.");request.setEncoding("utf8");request.addListener("data",function(postDataChunk){postData += postDataChunk;console.log("Received POST data chunk '"+postDataChunk +"'.");});request.addListener("end",function(){route(handle, pathname, response, postData);});}http.createServer(onRequest).listen(8888);console.log("Server has started."); }exports.start = start;

上述代碼做了三件事情: 首先,我們設置了接收數據的編碼格式為UTF-8,然后注冊了“data”事件的監聽器,用于收集每次接收到的新數據塊,并將其賦值給postData?變量,最后,我們將請求路由的調用移到end事件處理程序中,以確保它只會當所有數據接收完畢后才觸發,并且只觸發一次。我們同時還把POST數據傳遞給請求路由,因為這些數據,請求處理程序會用到。

上述代碼在每個數據塊到達的時候輸出了日志,這對于最終生產環境來說,是很不好的(數據量可能會很大,還記得吧?),但是,在開發階段是很有用的,有助于讓我們看到發生了什么。

我建議可以嘗試下,嘗試著去輸入一小段文本,以及大段內容,當大段內容的時候,就會發現data事件會觸發多次。

再來點酷的。我們接下來在/upload頁面,展示用戶輸入的內容。要實現該功能,我們需要將postData傳遞給請求處理程序,修改router.js為如下形式:

function route(handle, pathname, response, postData){console.log("About to route a request for "+ pathname);if(typeof handle[pathname]==='function'){handle[pathname](response, postData);}else{console.log("No request handler found for "+ pathname);response.writeHead(404,{"Content-Type":"text/plain"});response.write("404 Not found");response.end();} }exports.route = route;

然后,在requestHandlers.js中,我們將數據包含在對upload請求的響應中:

function start(response, postData){console.log("Request handler 'start' was called.");var body ='<html>'+'<head>'+'<meta http-equiv="Content-Type" content="text/html; '+'charset=UTF-8" />'+'</head>'+'<body>'+'<form action="/upload" method="post">'+'<textarea name="text" rows="20" cols="60"></textarea>'+'<input type="submit" value="Submit text" />'+'</form>'+'</body>'+'</html>';response.writeHead(200,{"Content-Type":"text/html"});response.write(body);response.end(); }function upload(response, postData){console.log("Request handler 'upload' was called.");response.writeHead(200,{"Content-Type":"text/plain"});response.write("You've sent: "+ postData);response.end(); }exports.start = start; exports.upload = upload;

好了,我們現在可以接收POST數據并在請求處理程序中處理該數據了。

我們最后要做的是: 當前我們是把請求的整個消息體傳遞給了請求路由和請求處理程序。我們應該只把POST數據中,我們感興趣的部分傳遞給請求路由和請求處理程序。在我們這個例子中,我們感興趣的其實只是text字段。

我們可以使用此前介紹過的querystring模塊來實現:

var querystring = require("querystring");function start(response, postData){console.log("Request handler 'start' was called.");var body ='<html>'+'<head>'+'<meta http-equiv="Content-Type" content="text/html; '+'charset=UTF-8" />'+'</head>'+'<body>'+'<form action="/upload" method="post">'+'<textarea name="text" rows="20" cols="60"></textarea>'+'<input type="submit" value="Submit text" />'+'</form>'+'</body>'+'</html>';response.writeHead(200,{"Content-Type":"text/html"});response.write(body);response.end(); }function upload(response, postData){console.log("Request handler 'upload' was called.");response.writeHead(200,{"Content-Type":"text/plain"});response.write("You've sent the text: "+querystring.parse(postData).text);response.end(); }exports.start = start; exports.upload = upload;

好了,以上就是關于處理POST數據的全部內容。

處理文件上傳

最后,我們來實現我們最終的用例:允許用戶上傳圖片,并將該圖片在瀏覽器中顯示出來。

回到90年代,這個用例完全可以滿足用于IPO的商業模型了,如今,我們通過它能學到這樣兩件事情: 如何安裝外部Node.js模塊,以及如何將它們應用到我們的應用中。

這里我們要用到的外部模塊是Felix Geisend?rfer開發的node-formidable模塊。它對解析上傳的文件數據做了很好的抽象。 其實說白了,處理文件上傳“就是”處理POST數據 —— 但是,麻煩的是在具體的處理細節,所以,這里采用現成的方案更合適點。

使用該模塊,首先需要安裝該模塊。Node.js有它自己的包管理器,叫NPM。它可以讓安裝Node.js的外部模塊變得非常方便。通過如下一條命令就可以完成該模塊的安裝:

npm install formidable

如果終端輸出如下內容:

npm info build Success: formidable@1.0.9
npm ok

就說明模塊已經安裝成功了。

現在我們就可以用formidable模塊了——使用外部模塊與內部模塊類似,用require語句將其引入即可:

var formidable = require("formidable");

這里該模塊做的就是將通過HTTP POST請求提交的表單,在Node.js中可以被解析。我們要做的就是創建一個新的IncomingForm,它是對提交表單的抽象表示,之后,就可以用它解析request對象,獲取表單中需要的數據字段。

node-formidable官方的例子展示了這兩部分是如何融合在一起工作的:

var formidable = require('formidable'),http = require('http'),sys = require('sys');http.createServer(function(req, res){if(req.url =='/upload'&& req.method.toLowerCase()=='post'){// parse a file uploadvar form =new formidable.IncomingForm();form.parse(req,function(err, fields, files){res.writeHead(200,{'content-type':'text/plain'});res.write('received upload:\n\n');res.end(sys.inspect({fields: fields, files: files}));});return;}// show a file upload formres.writeHead(200,{'content-type':'text/html'});res.end('<form action="/upload" enctype="multipart/form-data" '+'method="post">'+'<input type="text" name="title"><br>'+'<input type="file" name="upload" multiple="multiple"><br>'+'<input type="submit" value="Upload">'+'</form>'); }).listen(8888);

如果我們將上述代碼,保存到一個文件中,并通過node來執行,就可以進行簡單的表單提交了,包括文件上傳。然后,可以看到通過調用form.parse傳遞給回調函數的files對象的內容,如下所示:

received upload:{ fields: { title: 'Hello World' },files:{ upload:{ size: 1558,path: '/tmp/1c747974a27a6292743669e91f29350b',name: 'us-flag.png',type: 'image/png',lastModifiedDate: Tue, 21 Jun 2011 07:02:41 GMT,_writeStream: [Object],length: [Getter],filename: [Getter],mime: [Getter] } } }

為了實現我們的功能,我們需要將上述代碼應用到我們的應用中,另外,我們還要考慮如何將上傳文件的內容(保存在/tmp目錄中)顯示到瀏覽器中。

我們先來解決后面那個問題: 對于保存在本地硬盤中的文件,如何才能在瀏覽器中看到呢?

顯然,我們需要將該文件讀取到我們的服務器中,使用一個叫fs的模塊。

我們來添加/showURL的請求處理程序,該處理程序直接硬編碼將文件/tmp/test.png內容展示到瀏覽器中。當然了,首先需要將該圖片保存到這個位置才行。

將requestHandlers.js修改為如下形式:

var querystring = require("querystring"),fs = require("fs");function start(response, postData){console.log("Request handler 'start' was called.");var body ='<html>'+'<head>'+'<meta http-equiv="Content-Type" '+'content="text/html; charset=UTF-8" />'+'</head>'+'<body>'+'<form action="/upload" method="post">'+'<textarea name="text" rows="20" cols="60"></textarea>'+'<input type="submit" value="Submit text" />'+'</form>'+'</body>'+'</html>';response.writeHead(200,{"Content-Type":"text/html"});response.write(body);response.end(); }function upload(response, postData){console.log("Request handler 'upload' was called.");response.writeHead(200,{"Content-Type":"text/plain"});response.write("You've sent the text: "+querystring.parse(postData).text);response.end(); }function show(response, postData){console.log("Request handler 'show' was called.");fs.readFile("/tmp/test.png","binary",function(error, file){if(error){response.writeHead(500,{"Content-Type":"text/plain"});response.write(error +"\n");response.end();}else{response.writeHead(200,{"Content-Type":"image/png"});response.write(file,"binary");response.end();}}); }exports.start = start; exports.upload = upload; exports.show = show;

我們還需要將這新的請求處理程序,添加到index.js中的路由映射表中:

var server = require("./server"); var router = require("./router"); var requestHandlers = require("./requestHandlers");var handle ={} handle["/"]= requestHandlers.start; handle["/start"]= requestHandlers.start; handle["/upload"]= requestHandlers.upload; handle["/show"]= requestHandlers.show;server.start(router.route, handle);

重啟服務器之后,通過訪問http://localhost:8888/show,就可以看到保存在/tmp/test.png的圖片了。

好,最后我們要的就是:

?

  • 在/start表單中添加一個文件上傳元素
  • 將node-formidable整合到我們的upload請求處理程序中,用于將上傳的圖片保存到/tmp/test.png
  • 將上傳的圖片內嵌到/uploadURL輸出的HTML中

?

第一項很簡單。只需要在HTML表單中,添加一個multipart/form-data的編碼類型,移除此前的文本區,添加一個文件上傳組件,并將提交按鈕的文案改為“Upload file”即可。 如下requestHandler.js所示:

var querystring = require("querystring"),fs = require("fs");function start(response, postData){console.log("Request handler 'start' was called.");var body ='<html>'+'<head>'+'<meta http-equiv="Content-Type" '+'content="text/html; charset=UTF-8" />'+'</head>'+'<body>'+'<form action="/upload" enctype="multipart/form-data" '+'method="post">'+'<input type="file" name="upload">'+'<input type="submit" value="Upload file" />'+'</form>'+'</body>'+'</html>';response.writeHead(200,{"Content-Type":"text/html"});response.write(body);response.end(); }function upload(response, postData){console.log("Request handler 'upload' was called.");response.writeHead(200,{"Content-Type":"text/plain"});response.write("You've sent the text: "+querystring.parse(postData).text);response.end(); }function show(response, postData){console.log("Request handler 'show' was called.");fs.readFile("/tmp/test.png","binary",function(error, file){if(error){response.writeHead(500,{"Content-Type":"text/plain"});response.write(error +"\n");response.end();}else{response.writeHead(200,{"Content-Type":"image/png"});response.write(file,"binary");response.end();}}); }exports.start = start; exports.upload = upload; exports.show = show;

很好。下一步相對比較復雜。這里有這樣一個問題: 我們需要在upload處理程序中對上傳的文件進行處理,這樣的話,我們就需要將request對象傳遞給node-formidable的form.parse函數。

但是,我們有的只是response對象和postData數組。看樣子,我們只能不得不將request對象從服務器開始一路通過請求路由,再傳遞給請求處理程序。 或許還有更好的方案,但是,不管怎么說,目前這樣做可以滿足我們的需求。

到這里,我們可以將postData從服務器以及請求處理程序中移除了 —— 一方面,對于我們處理文件上傳來說已經不需要了,另外一方面,它甚至可能會引發這樣一個問題: 我們已經“消耗”了request對象中的數據,這意味著,對于form.parse來說,當它想要獲取數據的時候就什么也獲取不到了。(因為Node.js不會對數據做緩存)

我們從server.js開始 —— 移除對postData的處理以及request.setEncoding?(這部分node-formidable自身會處理),轉而采用將request對象傳遞給請求路由的方式:

var http = require("http"); var url = require("url");function start(route, handle){function onRequest(request, response){var pathname = url.parse(request.url).pathname;console.log("Request for "+ pathname +" received.");route(handle, pathname, response, request);}http.createServer(onRequest).listen(8888);console.log("Server has started."); }exports.start = start; 接下來是 router.js —— 我們不再需要傳遞postData了,這次要傳遞request對象:function route(handle, pathname, response, request){console.log("About to route a request for "+ pathname);if(typeof handle[pathname]==='function'){handle[pathname](response, request);}else{console.log("No request handler found for "+ pathname);response.writeHead(404,{"Content-Type":"text/html"});response.write("404 Not found");response.end();} }exports.route = route;

現在,request對象就可以在我們的upload請求處理程序中使用了。node-formidable會處理將上傳的文件保存到本地/tmp目錄中,而我們需要做的是確保該文件保存成/tmp/test.png。 沒錯,我們保持簡單,并假設只允許上傳PNG圖片。

這里采用fs.renameSync(path1,path2)來實現。要注意的是,正如其名,該方法是同步執行的, 也就是說,如果該重命名的操作很耗時的話會阻塞。 這塊我們先不考慮。

接下來,我們把處理文件上傳以及重命名的操作放到一起,如下requestHandlers.js所示:

var querystring = require("querystring"),fs = require("fs"),formidable = require("formidable");function start(response){console.log("Request handler 'start' was called.");var body ='<html>'+'<head>'+'<meta http-equiv="Content-Type" content="text/html; '+'charset=UTF-8" />'+'</head>'+'<body>'+'<form action="/upload" enctype="multipart/form-data" '+'method="post">'+'<input type="file" name="upload" multiple="multiple">'+'<input type="submit" value="Upload file" />'+'</form>'+'</body>'+'</html>';response.writeHead(200,{"Content-Type":"text/html"});response.write(body);response.end(); }function upload(response, request){console.log("Request handler 'upload' was called.");var form =new formidable.IncomingForm();console.log("about to parse");form.parse(request,function(error, fields, files){console.log("parsing done");fs.renameSync(files.upload.path,"/tmp/test.png");response.writeHead(200,{"Content-Type":"text/html"});response.write("received image:<br/>");response.write("<img src='/show' />");response.end();}); }function show(response){console.log("Request handler 'show' was called.");fs.readFile("/tmp/test.png","binary",function(error, file){if(error){response.writeHead(500,{"Content-Type":"text/plain"});response.write(error +"\n");response.end();}else{response.writeHead(200,{"Content-Type":"image/png"});response.write(file,"binary");response.end();}}); }exports.start = start; exports.upload = upload; exports.show = show;

好了,重啟服務器,我們應用所有的功能就可以用了。選擇一張本地圖片,將其上傳到服務器,然后瀏覽器就會顯示該圖片。

總結與展望

恭喜,我們的任務已經完成了!我們開發完了一個Node.js的web應用,應用雖小,但卻“五臟俱全”。 期間,我們介紹了很多技術點:服務端JavaScript、函數式編程、阻塞與非阻塞、回調、事件、內部和外部模塊等等。

當然了,還有許多本書沒有介紹到的: 如何操作數據庫、如何進行單元測試、如何開發Node.js的外部模塊以及一些簡單的諸如如何獲取GET請求之類的方法。

但本書畢竟只是一本給初學者的教程 —— 不可能覆蓋到所有的內容。

幸運的是,Node.js社區非常活躍(作個不恰當的比喻就是猶如一群有多動癥小孩子在一起,能不活躍嗎?), 這意味著,有許多關于Node.js的資源,有什么問題都可以向社區尋求解答。 其中Node.js社區的wiki以及?NodeCloud就是最好的資源。

轉載于:https://www.cnblogs.com/niubenbit/p/3745085.html

總結

以上是生活随笔為你收集整理的Nodejs入门【转载】保留备用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日本免费一区二区三区最新 | 国产香蕉尹人综合在线观看 | 国产成人无码a区在线观看视频app | 亚洲精品一区三区三区在线观看 | 日本护士毛茸茸高潮 | 97夜夜澡人人双人人人喊 | 国产精品美女久久久 | 色婷婷久久一区二区三区麻豆 | 成人免费视频一区二区 | 国产又爽又黄又刺激的视频 | 精品日本一区二区三区在线观看 | 亚洲精品成人av在线 | 乱人伦人妻中文字幕无码久久网 | 精品国偷自产在线 | 少妇的肉体aa片免费 | av香港经典三级级 在线 | 中文字幕人妻无码一夲道 | 东京一本一道一二三区 | 日本精品高清一区二区 | 久久97精品久久久久久久不卡 | 亚洲人亚洲人成电影网站色 | 国产精品欧美成人 | 久久午夜夜伦鲁鲁片无码免费 | 伦伦影院午夜理论片 | 人人妻人人澡人人爽欧美一区九九 | 久久久精品欧美一区二区免费 | 精品欧美一区二区三区久久久 | 少妇久久久久久人妻无码 | 伊人久久大香线蕉亚洲 | 女人色极品影院 | 国产成人人人97超碰超爽8 | 亚洲国产av美女网站 | 黑人玩弄人妻中文在线 | 人人澡人人透人人爽 | 狂野欧美性猛交免费视频 | 成人欧美一区二区三区黑人免费 | 人人澡人摸人人添 | 免费无码肉片在线观看 | 爆乳一区二区三区无码 | 无套内谢的新婚少妇国语播放 | 婷婷五月综合缴情在线视频 | 久久久久久久女国产乱让韩 | 国产亚洲精品久久久闺蜜 | 狠狠色噜噜狠狠狠7777奇米 | 2020久久香蕉国产线看观看 | 国产麻豆精品精东影业av网站 | 大色综合色综合网站 | 国产亚洲美女精品久久久2020 | 99视频精品全部免费免费观看 | а√天堂www在线天堂小说 | 欧美熟妇另类久久久久久多毛 | 在线精品国产一区二区三区 | 女人和拘做爰正片视频 | 国产又粗又硬又大爽黄老大爷视 | 无码人妻黑人中文字幕 | 色婷婷久久一区二区三区麻豆 | 日韩欧美中文字幕在线三区 | 国产精品高潮呻吟av久久4虎 | 狠狠色噜噜狠狠狠狠7777米奇 | 天天拍夜夜添久久精品大 | 成熟人妻av无码专区 | 日本饥渴人妻欲求不满 | 亚洲精品久久久久avwww潮水 | 国产成人久久精品流白浆 | 日韩欧美成人免费观看 | 亚洲中文字幕在线无码一区二区 | 色婷婷综合激情综在线播放 | 中文字幕无码日韩专区 | 午夜福利一区二区三区在线观看 | 婷婷五月综合缴情在线视频 | 国产在热线精品视频 | 中文字幕色婷婷在线视频 | 精品熟女少妇av免费观看 | 人人妻人人澡人人爽欧美精品 | 国内精品人妻无码久久久影院蜜桃 | 夫妻免费无码v看片 | 日本精品少妇一区二区三区 | 精品偷自拍另类在线观看 | 在线观看欧美一区二区三区 | 色欲久久久天天天综合网精品 | 无码精品国产va在线观看dvd | 欧美人与动性行为视频 | 99久久精品日本一区二区免费 | 欧美亚洲日韩国产人成在线播放 | 精品一区二区不卡无码av | 麻豆国产人妻欲求不满 | 亚洲中文字幕va福利 | 亚洲国产欧美日韩精品一区二区三区 | 久久国产劲爆∧v内射 | 色狠狠av一区二区三区 | 亚洲日韩av片在线观看 | 国产成人一区二区三区别 | 少妇人妻偷人精品无码视频 | 日本欧美一区二区三区乱码 | 日日天日日夜日日摸 | 久久婷婷五月综合色国产香蕉 | 国产亚洲精品精品国产亚洲综合 | 国产免费久久久久久无码 | 国产两女互慰高潮视频在线观看 | 人妻与老人中文字幕 | 日韩精品无码一区二区中文字幕 | 亚洲精品成人福利网站 | 无套内谢的新婚少妇国语播放 | 日韩人妻无码中文字幕视频 | 亚洲国产成人av在线观看 | v一区无码内射国产 | 最近的中文字幕在线看视频 | 国产精品久久福利网站 | 大肉大捧一进一出好爽视频 | 久久国语露脸国产精品电影 | 亚洲日韩一区二区三区 | 波多野42部无码喷潮在线 | 亚洲自偷自拍另类第1页 | 国产深夜福利视频在线 | 久久久久国色av免费观看性色 | 精品国产一区二区三区av 性色 | 亚拍精品一区二区三区探花 | 中文字幕av无码一区二区三区电影 | 国产精品久久久久9999小说 | 成人无码精品1区2区3区免费看 | 亚洲国产精品一区二区美利坚 | 亚洲成在人网站无码天堂 | 无码纯肉视频在线观看 | 国产sm调教视频在线观看 | 精品无码国产自产拍在线观看蜜 | 亚洲日本一区二区三区在线 | 国产午夜亚洲精品不卡下载 | 欧美丰满少妇xxxx性 | 国产日产欧产精品精品app | 国产午夜视频在线观看 | 精品国产麻豆免费人成网站 | 亚洲国产成人av在线观看 | 久久综合色之久久综合 | 欧美日韩一区二区免费视频 | 亚洲中文字幕无码中文字在线 | 2019午夜福利不卡片在线 | 免费国产成人高清在线观看网站 | 日韩欧美成人免费观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 日日碰狠狠躁久久躁蜜桃 | 亚洲天堂2017无码 | 亚洲 日韩 欧美 成人 在线观看 | 国产真实乱对白精彩久久 | 久久人人爽人人爽人人片ⅴ | 亚洲成在人网站无码天堂 | 熟女俱乐部五十路六十路av | 久久成人a毛片免费观看网站 | 中国女人内谢69xxxxxa片 | 精品无码一区二区三区爱欲 | 男人的天堂2018无码 | 无码任你躁久久久久久久 | 99精品无人区乱码1区2区3区 | 图片小说视频一区二区 | 荫蒂添的好舒服视频囗交 | 日日干夜夜干 | 亚洲成av人片天堂网无码】 | 97夜夜澡人人爽人人喊中国片 | 狠狠色丁香久久婷婷综合五月 | 国产亲子乱弄免费视频 | 久久成人a毛片免费观看网站 | 水蜜桃色314在线观看 | 亚洲男人av香蕉爽爽爽爽 | 国产免费久久久久久无码 | 九月婷婷人人澡人人添人人爽 | a国产一区二区免费入口 | 夜精品a片一区二区三区无码白浆 | 欧美日韩一区二区免费视频 | 无码任你躁久久久久久久 | 双乳奶水饱满少妇呻吟 | 亚洲一区二区三区偷拍女厕 | 欧美真人作爱免费视频 | 亚洲s码欧洲m码国产av | 国内少妇偷人精品视频免费 | 亚洲精品中文字幕 | 国产乱人无码伦av在线a | 中文字幕乱码人妻二区三区 | 亚洲精品一区二区三区四区五区 | 中文字幕无码日韩专区 | 国产福利视频一区二区 | 中文字幕av日韩精品一区二区 | 亚洲精品一区二区三区在线 | 久久久精品456亚洲影院 | 午夜性刺激在线视频免费 | 日日天干夜夜狠狠爱 | 在线视频网站www色 | 香港三级日本三级妇三级 | 无码av免费一区二区三区试看 | 亚洲国产一区二区三区在线观看 | 成人无码视频在线观看网站 | 国产亚洲精品久久久久久久 | 久久99久久99精品中文字幕 | 日本熟妇乱子伦xxxx | 久久综合给久久狠狠97色 | 国产精品18久久久久久麻辣 | 国产成人精品久久亚洲高清不卡 | 熟女少妇在线视频播放 | 国产成人无码av片在线观看不卡 | 国产精品久久福利网站 | 国产网红无码精品视频 | 麻豆人妻少妇精品无码专区 | 正在播放老肥熟妇露脸 | 久久人人爽人人爽人人片ⅴ | 亚洲七七久久桃花影院 | 国内精品久久久久久中文字幕 | 鲁一鲁av2019在线 | 黑森林福利视频导航 | 久久综合九色综合欧美狠狠 | 亚洲 高清 成人 动漫 | 乱码午夜-极国产极内射 | 国产午夜视频在线观看 | 久久伊人色av天堂九九小黄鸭 | 国产精品免费大片 | 中文字幕人妻无码一区二区三区 | 免费观看的无遮挡av | 人妻少妇精品视频专区 | 国产真人无遮挡作爱免费视频 | 久久亚洲中文字幕精品一区 | 欧美野外疯狂做受xxxx高潮 | 亚洲s码欧洲m码国产av | 亚洲娇小与黑人巨大交 | 亚洲国产精品久久久天堂 | 97人妻精品一区二区三区 | 国产精品高潮呻吟av久久4虎 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲国产欧美国产综合一区 | 国语精品一区二区三区 | 免费观看黄网站 | 成人欧美一区二区三区黑人 | 亚洲国产精品无码一区二区三区 | 男人扒开女人内裤强吻桶进去 | 日本饥渴人妻欲求不满 | 免费看男女做好爽好硬视频 | 久久久成人毛片无码 | 装睡被陌生人摸出水好爽 | 亚洲中文字幕av在天堂 | 丝袜足控一区二区三区 | 日韩精品成人一区二区三区 | 青草视频在线播放 | 日韩亚洲欧美精品综合 | 国产精品人妻一区二区三区四 | 亚洲精品久久久久avwww潮水 | 欧美精品在线观看 | 亚洲国产精品久久久久久 | 日产精品高潮呻吟av久久 | 亚洲成a人片在线观看无码3d | 日韩亚洲欧美精品综合 | 日韩欧美中文字幕公布 | 欧美 丝袜 自拍 制服 另类 | 偷窥日本少妇撒尿chinese | 亚洲人成网站免费播放 | а√资源新版在线天堂 | 亚洲日本va中文字幕 | 麻豆av传媒蜜桃天美传媒 | 精品国产一区二区三区四区在线看 | 玩弄中年熟妇正在播放 | 婷婷五月综合激情中文字幕 | 亚洲а∨天堂久久精品2021 | 久久熟妇人妻午夜寂寞影院 | 色五月丁香五月综合五月 | 亚洲精品一区国产 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产口爆吞精在线视频 | 午夜福利不卡在线视频 | 少妇愉情理伦片bd | 久久精品成人欧美大片 | 色窝窝无码一区二区三区色欲 | 亚洲一区二区观看播放 | 国产精品va在线观看无码 | 国产舌乚八伦偷品w中 | 内射白嫩少妇超碰 | 无码人妻久久一区二区三区不卡 | 日产精品高潮呻吟av久久 | 六十路熟妇乱子伦 | 色五月丁香五月综合五月 | 日韩欧美群交p片內射中文 | 少妇愉情理伦片bd | 亚洲人成影院在线无码按摩店 | 网友自拍区视频精品 | 西西人体www44rt大胆高清 | 亚洲小说图区综合在线 | 国产精品久免费的黄网站 | 日韩欧美中文字幕在线三区 | 久久综合网欧美色妞网 | 亚洲高清偷拍一区二区三区 | 亚洲毛片av日韩av无码 | 人妻尝试又大又粗久久 | 沈阳熟女露脸对白视频 | 高清国产亚洲精品自在久久 | 国产精品内射视频免费 | 在线精品国产一区二区三区 | 97色伦图片97综合影院 | 性欧美牲交xxxxx视频 | 十八禁真人啪啪免费网站 | 18黄暴禁片在线观看 | 又湿又紧又大又爽a视频国产 | 狠狠色色综合网站 | 久久国产精品萌白酱免费 | 国产热a欧美热a在线视频 | 日本护士xxxxhd少妇 | 妺妺窝人体色www婷婷 | 小sao货水好多真紧h无码视频 | 婷婷丁香五月天综合东京热 | 成 人 免费观看网站 | 国产精品无码永久免费888 | 色狠狠av一区二区三区 | 国产精品久久久久久亚洲毛片 | 日本熟妇浓毛 | 成人女人看片免费视频放人 | 男人的天堂2018无码 | 国产精品久久久久久久影院 | 夜先锋av资源网站 | 97久久超碰中文字幕 | 中文字幕久久久久人妻 | 亚洲精品久久久久久一区二区 | 日日橹狠狠爱欧美视频 | 噜噜噜亚洲色成人网站 | 国产成人精品视频ⅴa片软件竹菊 | 国产亚洲精品久久久久久 | 国产精品人妻一区二区三区四 | 性色欲情网站iwww九文堂 | 97夜夜澡人人双人人人喊 | 5858s亚洲色大成网站www | 亚洲日本一区二区三区在线 | 国产av人人夜夜澡人人爽麻豆 | 亚洲精品国偷拍自产在线麻豆 | 少妇高潮喷潮久久久影院 | 夜精品a片一区二区三区无码白浆 | 色综合久久久无码中文字幕 | 一区二区三区乱码在线 | 欧洲 | 国产午夜亚洲精品不卡 | 婷婷综合久久中文字幕蜜桃三电影 | 一个人免费观看的www视频 | 国产绳艺sm调教室论坛 | 蜜桃无码一区二区三区 | 熟女少妇人妻中文字幕 | 亚洲中文字幕乱码av波多ji | 日产精品99久久久久久 | 中文字幕乱码中文乱码51精品 | 99久久99久久免费精品蜜桃 | 亚洲国产精品久久久久久 | 少妇的肉体aa片免费 | 九九久久精品国产免费看小说 | 少妇被黑人到高潮喷出白浆 | 大肉大捧一进一出视频出来呀 | 国产精品无码一区二区桃花视频 | 国产精品人妻一区二区三区四 | 亚洲最大成人网站 | 99久久久国产精品无码免费 | 嫩b人妻精品一区二区三区 | 久久久久人妻一区精品色欧美 | 久久久久久久人妻无码中文字幕爆 | 无码av岛国片在线播放 | 久久视频在线观看精品 | 成人免费视频在线观看 | 欧洲vodafone精品性 | 377p欧洲日本亚洲大胆 | 亚洲成av人影院在线观看 | 红桃av一区二区三区在线无码av | 亚洲一区二区三区含羞草 | 大乳丰满人妻中文字幕日本 | 99久久精品国产一区二区蜜芽 | 色综合久久久无码中文字幕 | 噜噜噜亚洲色成人网站 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲精品国偷拍自产在线麻豆 | 激情亚洲一区国产精品 | 97se亚洲精品一区 | 久久精品国产99精品亚洲 | 97精品人妻一区二区三区香蕉 | 国产福利视频一区二区 | 亚洲码国产精品高潮在线 | 无码人妻精品一区二区三区不卡 | 377p欧洲日本亚洲大胆 | 免费网站看v片在线18禁无码 | 一区二区三区高清视频一 | 粉嫩少妇内射浓精videos | 亚洲欧美国产精品专区久久 | 免费人成在线观看网站 | 国产乡下妇女做爰 | 久久精品无码一区二区三区 | 天天拍夜夜添久久精品 | 麻花豆传媒剧国产免费mv在线 | 亚洲の无码国产の无码步美 | 水蜜桃色314在线观看 | 牲欲强的熟妇农村老妇女 | 精品国产成人一区二区三区 | 中国大陆精品视频xxxx | 色综合久久久久综合一本到桃花网 | 男女猛烈xx00免费视频试看 | 亚洲国产精品无码久久久久高潮 | 欧美性黑人极品hd | 欧美亚洲国产一区二区三区 | 爽爽影院免费观看 | 国产人妻大战黑人第1集 | 十八禁真人啪啪免费网站 | 中文无码精品a∨在线观看不卡 | 亚洲爆乳大丰满无码专区 | 一本久道高清无码视频 | 狂野欧美性猛交免费视频 | 成人无码视频在线观看网站 | 亚洲高清偷拍一区二区三区 | 人妻有码中文字幕在线 | 亚洲日本在线电影 | 麻豆精品国产精华精华液好用吗 | 日日碰狠狠丁香久燥 | 亚洲熟熟妇xxxx | 久久国语露脸国产精品电影 | 国产熟女一区二区三区四区五区 | 国产真实乱对白精彩久久 | 大色综合色综合网站 | 久久综合给合久久狠狠狠97色 | 色婷婷久久一区二区三区麻豆 | 两性色午夜视频免费播放 | 国产小呦泬泬99精品 | 无码人妻久久一区二区三区不卡 | 性生交片免费无码看人 | 天堂а√在线中文在线 | 中文字幕 亚洲精品 第1页 | 亚洲中文字幕无码中文字在线 | 中文字幕乱妇无码av在线 | 性色欲网站人妻丰满中文久久不卡 | 2019午夜福利不卡片在线 | 久久精品国产日本波多野结衣 | 激情人妻另类人妻伦 | 日本精品久久久久中文字幕 | 狂野欧美激情性xxxx | 男女下面进入的视频免费午夜 | 国产亚洲精品久久久久久久久动漫 | 男女猛烈xx00免费视频试看 | 欧美日韩一区二区三区自拍 | 成人免费视频在线观看 | аⅴ资源天堂资源库在线 | 亚洲国产日韩a在线播放 | 成人欧美一区二区三区黑人免费 | 天天躁夜夜躁狠狠是什么心态 | 亚洲精品国产精品乱码视色 | 国产香蕉尹人综合在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 一本色道久久综合狠狠躁 | 亚洲午夜久久久影院 | 最近的中文字幕在线看视频 | 麻豆人妻少妇精品无码专区 | 性色欲网站人妻丰满中文久久不卡 | 无码一区二区三区在线观看 | 国产黑色丝袜在线播放 | 精品偷自拍另类在线观看 | 色五月丁香五月综合五月 | 99久久婷婷国产综合精品青草免费 | 欧美xxxx黑人又粗又长 | www一区二区www免费 | 国产成人午夜福利在线播放 | 波多野结衣一区二区三区av免费 | 久久久精品国产sm最大网站 | 偷窥村妇洗澡毛毛多 | 国产精品美女久久久久av爽李琼 | 久久精品国产99精品亚洲 | 日本一区二区三区免费播放 | 亚洲国产精品美女久久久久 | 日韩av无码中文无码电影 | 国産精品久久久久久久 | 久久99精品国产麻豆蜜芽 | 亚洲成av人综合在线观看 | 激情内射亚州一区二区三区爱妻 | 内射爽无广熟女亚洲 | 熟女体下毛毛黑森林 | 亚洲精品成人福利网站 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲人成网站在线播放942 | 国产va免费精品观看 | 免费观看又污又黄的网站 | 亚洲精品一区二区三区在线观看 | 国产综合色产在线精品 | 欧美丰满少妇xxxx性 | 中文字幕无码乱人伦 | 亚洲熟妇色xxxxx欧美老妇y | 国产人妻人伦精品 | 久久综合网欧美色妞网 | 国产亚洲美女精品久久久2020 | 对白脏话肉麻粗话av | 国内少妇偷人精品视频 | 中文字幕无码视频专区 | 伊人久久大香线蕉av一区二区 | 男女猛烈xx00免费视频试看 | 少妇太爽了在线观看 | 欧美 亚洲 国产 另类 | 亚洲熟女一区二区三区 | aⅴ亚洲 日韩 色 图网站 播放 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲色www成人永久网址 | 欧美猛少妇色xxxxx | 久久精品女人天堂av免费观看 | 久久久久久久久888 | 精品日本一区二区三区在线观看 | 久久久婷婷五月亚洲97号色 | 国产成人综合色在线观看网站 | 欧美精品无码一区二区三区 | 亚洲毛片av日韩av无码 | 亚洲狠狠色丁香婷婷综合 | 亚洲精品一区二区三区四区五区 | 欧美日韩一区二区综合 | 97色伦图片97综合影院 | 色一情一乱一伦一区二区三欧美 | 三级4级全黄60分钟 | 97夜夜澡人人双人人人喊 | 色综合久久久无码网中文 | 无码人妻精品一区二区三区下载 | 天堂在线观看www | 亚洲a无码综合a国产av中文 | 国产在线aaa片一区二区99 | 国产精品美女久久久 | 久激情内射婷内射蜜桃人妖 | 131美女爱做视频 | 内射白嫩少妇超碰 | 精品人人妻人人澡人人爽人人 | 国产偷国产偷精品高清尤物 | 国产人妻久久精品二区三区老狼 | 麻豆av传媒蜜桃天美传媒 | 日韩av激情在线观看 | 熟女体下毛毛黑森林 | 亚洲日韩av一区二区三区中文 | 伊人久久大香线蕉亚洲 | 18精品久久久无码午夜福利 | 国产精品久久久久久亚洲影视内衣 | 欧美阿v高清资源不卡在线播放 | 中文字幕无码热在线视频 | 精品无人国产偷自产在线 | 麻豆成人精品国产免费 | av在线亚洲欧洲日产一区二区 | 熟妇人妻无码xxx视频 | 成人欧美一区二区三区黑人免费 | 欧美怡红院免费全部视频 | 激情内射日本一区二区三区 | 日本高清一区免费中文视频 | 国精产品一品二品国精品69xx | 激情国产av做激情国产爱 | 美女黄网站人色视频免费国产 | 国产精品内射视频免费 | 国产莉萝无码av在线播放 | 荫蒂添的好舒服视频囗交 | 亚洲一区二区观看播放 | 国产舌乚八伦偷品w中 | 国语精品一区二区三区 | 一个人免费观看的www视频 | 久久精品一区二区三区四区 | 亚洲人成网站在线播放942 | 熟女俱乐部五十路六十路av | а√资源新版在线天堂 | 欧美高清在线精品一区 | 牲欲强的熟妇农村老妇女视频 | 熟女俱乐部五十路六十路av | 少妇人妻av毛片在线看 | 97资源共享在线视频 | 99精品国产综合久久久久五月天 | 精品成在人线av无码免费看 | 久久国产精品精品国产色婷婷 | 亚洲综合伊人久久大杳蕉 | 久久久精品人妻久久影视 | 亚洲伊人久久精品影院 | 亚洲自偷自偷在线制服 | 无码人妻精品一区二区三区不卡 | 亚洲人成网站免费播放 | 国产69精品久久久久app下载 | 东京无码熟妇人妻av在线网址 | 国产成人无码一二三区视频 | 少妇被粗大的猛进出69影院 | 人妻aⅴ无码一区二区三区 | 无码一区二区三区在线观看 | 99er热精品视频 | 成人无码影片精品久久久 | 3d动漫精品啪啪一区二区中 | 强伦人妻一区二区三区视频18 | 无码人中文字幕 | 亚洲区小说区激情区图片区 | 色 综合 欧美 亚洲 国产 | 97精品人妻一区二区三区香蕉 | 国产亚洲日韩欧美另类第八页 | 国产激情无码一区二区app | 人妻少妇精品无码专区二区 | 特大黑人娇小亚洲女 | 窝窝午夜理论片影院 | 色婷婷久久一区二区三区麻豆 | 国产av无码专区亚洲awww | 成 人 免费观看网站 | 国产成人亚洲综合无码 | 亲嘴扒胸摸屁股激烈网站 | 波多野42部无码喷潮在线 | 国产免费久久久久久无码 | 老头边吃奶边弄进去呻吟 | 精品水蜜桃久久久久久久 | 国产精品资源一区二区 | 亚洲一区二区三区国产精华液 | 久久亚洲a片com人成 | 99久久久无码国产精品免费 | 99久久久无码国产aaa精品 | 日韩人妻无码一区二区三区久久99 | 日日躁夜夜躁狠狠躁 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 免费无码一区二区三区蜜桃大 | 国产成人精品优优av | 一区二区传媒有限公司 | 精品国产成人一区二区三区 | 国产人妻人伦精品1国产丝袜 | 精品一区二区三区波多野结衣 | 激情亚洲一区国产精品 | 国产精品亚洲一区二区三区喷水 | 中文字幕乱码中文乱码51精品 | 麻豆国产97在线 | 欧洲 | 国产精品人人妻人人爽 | 国产精品爱久久久久久久 | 少妇厨房愉情理9仑片视频 | 国产麻豆精品精东影业av网站 | 国语精品一区二区三区 | 国产亚洲精品久久久久久国模美 | 真人与拘做受免费视频一 | 丰满肥臀大屁股熟妇激情视频 | 粉嫩少妇内射浓精videos | 中文字幕乱码人妻无码久久 | 99精品国产综合久久久久五月天 | 国产av一区二区三区最新精品 | 国产莉萝无码av在线播放 | 亚洲精品一区二区三区大桥未久 | 人人超人人超碰超国产 | 天堂无码人妻精品一区二区三区 | 欧美日韩人成综合在线播放 | 强辱丰满人妻hd中文字幕 | 美女毛片一区二区三区四区 | 成在人线av无码免观看麻豆 | 无码毛片视频一区二区本码 | 精品一二三区久久aaa片 | 人人澡人人透人人爽 | 欧美freesex黑人又粗又大 | 最新国产麻豆aⅴ精品无码 | 粉嫩少妇内射浓精videos | 成人女人看片免费视频放人 | 97资源共享在线视频 | 亚洲精品久久久久中文第一幕 | 精品无码国产一区二区三区av | 精品无码一区二区三区爱欲 | 亚洲精品久久久久中文第一幕 | 亚洲中文无码av永久不收费 | 在线成人www免费观看视频 | 欧美激情一区二区三区成人 | 中文毛片无遮挡高清免费 | 97资源共享在线视频 | 久久精品国产精品国产精品污 | 亚洲色偷偷偷综合网 | 黑人玩弄人妻中文在线 | 无遮挡啪啪摇乳动态图 | 欧美野外疯狂做受xxxx高潮 | 久久aⅴ免费观看 | 久久亚洲中文字幕精品一区 | 亚洲日本一区二区三区在线 | 国产 浪潮av性色四虎 | 99久久精品午夜一区二区 | 性欧美熟妇videofreesex | 一区二区三区乱码在线 | 欧洲 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲爆乳精品无码一区二区三区 | 色偷偷人人澡人人爽人人模 | 亚洲国产精品一区二区第一页 | 亚洲日韩中文字幕在线播放 | 国产一区二区三区影院 | 永久免费观看美女裸体的网站 | 欧美日韩亚洲国产精品 | 国内少妇偷人精品视频 | 人人超人人超碰超国产 | 无码人妻久久一区二区三区不卡 | 丰满少妇弄高潮了www | 亚洲精品一区三区三区在线观看 | 色妞www精品免费视频 | 97精品人妻一区二区三区香蕉 | 无码人妻久久一区二区三区不卡 | 久久精品成人欧美大片 | 免费男性肉肉影院 | www国产亚洲精品久久网站 | 色婷婷久久一区二区三区麻豆 | 狠狠躁日日躁夜夜躁2020 | 少妇无码av无码专区在线观看 | 久久99国产综合精品 | 中文字幕人妻丝袜二区 | 奇米影视7777久久精品人人爽 | 亚洲国产精华液网站w | 成熟人妻av无码专区 | 成人一在线视频日韩国产 | 亚洲乱码国产乱码精品精 | 亚洲精品一区二区三区在线 | 日日躁夜夜躁狠狠躁 | 亚洲成av人片天堂网无码】 | 精品人妻av区 | 亚洲熟悉妇女xxx妇女av | 蜜臀av在线播放 久久综合激激的五月天 | a国产一区二区免费入口 | 2019nv天堂香蕉在线观看 | 最新国产麻豆aⅴ精品无码 | 欧美人妻一区二区三区 | 无遮无挡爽爽免费视频 | 18禁黄网站男男禁片免费观看 | 久久久久久久久888 | 高潮喷水的毛片 | 日韩精品成人一区二区三区 | 久久久精品成人免费观看 | 国产av剧情md精品麻豆 | 中国女人内谢69xxxxxa片 | 狂野欧美激情性xxxx | 一二三四社区在线中文视频 | 天堂久久天堂av色综合 | 欧美日韩精品 | 中文字幕无码免费久久9一区9 | 国产精品美女久久久久av爽李琼 | 极品尤物被啪到呻吟喷水 | 久久国产精品偷任你爽任你 | 国产人妻大战黑人第1集 | 成年女人永久免费看片 | 国产精品无码成人午夜电影 | 亚洲欧美日韩国产精品一区二区 | 国产热a欧美热a在线视频 | 欧美人妻一区二区三区 | 色婷婷欧美在线播放内射 | 亚洲中文字幕无码中字 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产艳妇av在线观看果冻传媒 | 国产欧美亚洲精品a | 欧美性生交xxxxx久久久 | 日韩亚洲欧美中文高清在线 | 97久久精品无码一区二区 | 无码一区二区三区在线观看 | 亚洲精品一区二区三区婷婷月 | 日本一卡2卡3卡四卡精品网站 | 在教室伦流澡到高潮hnp视频 | 国产深夜福利视频在线 | 小泽玛莉亚一区二区视频在线 | 国内精品九九久久久精品 | 国产亚洲精品精品国产亚洲综合 | 久久精品中文字幕大胸 | 精品国产av色一区二区深夜久久 | 乱码av麻豆丝袜熟女系列 | 精品夜夜澡人妻无码av蜜桃 | a片免费视频在线观看 | 久久伊人色av天堂九九小黄鸭 | 日韩精品一区二区av在线 | 日本xxxx色视频在线观看免费 | 乱码午夜-极国产极内射 | 小sao货水好多真紧h无码视频 | www国产精品内射老师 | 一本一道久久综合久久 | 夜夜影院未满十八勿进 | 亚洲男人av天堂午夜在 | 欧美国产日韩亚洲中文 | 久久久久久久女国产乱让韩 | 天海翼激烈高潮到腰振不止 | 熟妇女人妻丰满少妇中文字幕 | 天干天干啦夜天干天2017 | 18禁黄网站男男禁片免费观看 | 国内精品人妻无码久久久影院 | 国精产品一品二品国精品69xx | 99久久无码一区人妻 | 乱人伦人妻中文字幕无码 | 蜜臀av在线播放 久久综合激激的五月天 | 女人被男人躁得好爽免费视频 | 国内精品九九久久久精品 | 永久免费观看美女裸体的网站 | 欧美日韩色另类综合 | 中文字幕乱码人妻无码久久 | 亚洲色大成网站www | 中文字幕人妻无码一夲道 | 日日摸天天摸爽爽狠狠97 | 中文无码成人免费视频在线观看 | 成年美女黄网站色大免费全看 | 亚洲精品久久久久久一区二区 | 欧美老妇交乱视频在线观看 | 妺妺窝人体色www在线小说 | 欧美丰满少妇xxxx性 | 性欧美牲交xxxxx视频 | 成人亚洲精品久久久久软件 | 国产亚洲精品精品国产亚洲综合 | 欧美激情一区二区三区成人 | 欧洲熟妇精品视频 | 国产精品人妻一区二区三区四 | 黑人巨大精品欧美黑寡妇 | 天干天干啦夜天干天2017 | 欧美成人家庭影院 | 亚洲天堂2017无码 | 亚洲熟女一区二区三区 | 性色av无码免费一区二区三区 | 久久精品国产日本波多野结衣 | 国产熟女一区二区三区四区五区 | 国产精品理论片在线观看 | 伊人久久大香线蕉午夜 | 精品无码av一区二区三区 | 亚洲精品综合五月久久小说 | 午夜时刻免费入口 | 日本饥渴人妻欲求不满 | 国产麻豆精品精东影业av网站 | 精品aⅴ一区二区三区 | 亚洲日韩精品欧美一区二区 | 久久99久久99精品中文字幕 | 天堂亚洲免费视频 | 国产97在线 | 亚洲 | 欧美日韩亚洲国产精品 | 欧美激情综合亚洲一二区 | 黑人大群体交免费视频 | 国产一区二区三区四区五区加勒比 | 天堂无码人妻精品一区二区三区 | 亚洲s色大片在线观看 | 久久久婷婷五月亚洲97号色 | 精品国产一区二区三区av 性色 | 久久亚洲精品中文字幕无男同 | 色情久久久av熟女人妻网站 | 午夜精品久久久久久久 | 精品国偷自产在线视频 | 国产精品久久久久久无码 | 国产香蕉尹人综合在线观看 | 国产一精品一av一免费 | 中文字幕人妻无码一区二区三区 | 丰满少妇高潮惨叫视频 | 国产精品久久久久久无码 | 成人一区二区免费视频 | 国产亚洲精品久久久久久大师 | 1000部夫妻午夜免费 | 免费视频欧美无人区码 | 熟女俱乐部五十路六十路av | 日本护士xxxxhd少妇 | 成人免费无码大片a毛片 | 全球成人中文在线 | 亚洲国产精品无码久久久久高潮 | 老司机亚洲精品影院 | 国产精品久久久一区二区三区 | 亚洲日韩一区二区三区 | 成人欧美一区二区三区黑人免费 | 精品人妻人人做人人爽 | 蜜桃无码一区二区三区 | 久久久久久久人妻无码中文字幕爆 | 国产午夜亚洲精品不卡下载 | 国产性生大片免费观看性 | 中文字幕av日韩精品一区二区 | 久久精品一区二区三区四区 | 久久久久久九九精品久 | 国内精品一区二区三区不卡 | 亚洲自偷自拍另类第1页 | 久久精品国产一区二区三区 | 狠狠色丁香久久婷婷综合五月 | 日韩精品无码一区二区中文字幕 | 亚洲中文字幕无码中文字在线 | 国产在线精品一区二区高清不卡 | 四虎国产精品一区二区 | 久久天天躁狠狠躁夜夜免费观看 | 国产黑色丝袜在线播放 | 18精品久久久无码午夜福利 | 日本熟妇大屁股人妻 | 日韩精品无码一区二区中文字幕 | 丰满人妻被黑人猛烈进入 | 免费人成在线观看网站 | 国产午夜手机精彩视频 | 中文亚洲成a人片在线观看 | 爆乳一区二区三区无码 | 少妇性l交大片欧洲热妇乱xxx | 国产特级毛片aaaaaaa高清 | 亚洲日本va午夜在线电影 | 久久精品国产99精品亚洲 | 欧美日韩亚洲国产精品 | 欧美熟妇另类久久久久久不卡 | 国产精品久久久一区二区三区 | 少妇的肉体aa片免费 | 欧美国产日韩久久mv | 内射爽无广熟女亚洲 | a国产一区二区免费入口 | 亚洲色欲色欲天天天www | 国内精品人妻无码久久久影院蜜桃 | 国产精品美女久久久久av爽李琼 | 国产精品内射视频免费 | 亚洲另类伦春色综合小说 | 精品厕所偷拍各类美女tp嘘嘘 | 日日碰狠狠丁香久燥 | 久久国产劲爆∧v内射 | 午夜福利一区二区三区在线观看 | 扒开双腿疯狂进出爽爽爽视频 | 欧美xxxxx精品 | 妺妺窝人体色www婷婷 | 色综合久久中文娱乐网 | 亚洲一区二区观看播放 | 亚洲欧美中文字幕5发布 | 欧美性生交活xxxxxdddd | 欧美变态另类xxxx | 国内综合精品午夜久久资源 | 在线播放免费人成毛片乱码 | 狠狠cao日日穞夜夜穞av | 精品亚洲成av人在线观看 | 国产精品无码久久av | 日日碰狠狠躁久久躁蜜桃 | 亚洲国产av精品一区二区蜜芽 | 伊人久久婷婷五月综合97色 | 亚洲色大成网站www国产 | 在线视频网站www色 | 狠狠色丁香久久婷婷综合五月 | 日韩精品无码一本二本三本色 | 日韩少妇内射免费播放 | 精品久久久久久人妻无码中文字幕 | 永久免费观看国产裸体美女 | 久久久婷婷五月亚洲97号色 | 亚洲人成影院在线无码按摩店 | 好男人社区资源 | 国产97人人超碰caoprom | 欧美黑人巨大xxxxx | 亚洲色欲久久久综合网东京热 | 国内少妇偷人精品视频免费 | 国产一区二区三区四区五区加勒比 | 国産精品久久久久久久 | 5858s亚洲色大成网站www | 亚洲熟妇色xxxxx欧美老妇 | 国产成人一区二区三区在线观看 | 国产亚洲精品久久久闺蜜 | 一本精品99久久精品77 | 国产片av国语在线观看 | 色窝窝无码一区二区三区色欲 | 久久综合给久久狠狠97色 | 欧美阿v高清资源不卡在线播放 | 97无码免费人妻超级碰碰夜夜 | 未满成年国产在线观看 | 国产香蕉97碰碰久久人人 | 久久99精品国产麻豆蜜芽 | 大肉大捧一进一出视频出来呀 | 久久久久亚洲精品中文字幕 | 巨爆乳无码视频在线观看 | 伊人久久大香线蕉午夜 | 特大黑人娇小亚洲女 | 久久99精品久久久久久 | 精品久久综合1区2区3区激情 | 日韩精品无码免费一区二区三区 | 午夜无码区在线观看 | 久久精品视频在线看15 | 精品熟女少妇av免费观看 | 国产又爽又猛又粗的视频a片 | 日本精品人妻无码免费大全 | 亚洲区小说区激情区图片区 | 色情久久久av熟女人妻网站 | 久久99精品国产.久久久久 | 亚洲午夜福利在线观看 | 一本久久a久久精品vr综合 | av无码电影一区二区三区 | 亚洲精品欧美二区三区中文字幕 | 日韩人妻系列无码专区 | 在线精品亚洲一区二区 | 亚洲国产欧美国产综合一区 | 亚洲精品无码人妻无码 | 国产综合久久久久鬼色 | 无码一区二区三区在线 | 久久人人爽人人人人片 | 真人与拘做受免费视频 | av无码电影一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 永久免费观看美女裸体的网站 | 欧美喷潮久久久xxxxx | a国产一区二区免费入口 | 亚洲精品一区二区三区在线观看 | 亚洲午夜福利在线观看 | 内射爽无广熟女亚洲 | 噜噜噜亚洲色成人网站 | 亚洲无人区午夜福利码高清完整版 | 99精品国产综合久久久久五月天 | 久久综合九色综合欧美狠狠 | 最近中文2019字幕第二页 | 性色欲网站人妻丰满中文久久不卡 | 伊人久久大香线焦av综合影院 | 精品久久久中文字幕人妻 | 欧美熟妇另类久久久久久不卡 | 一本久久伊人热热精品中文字幕 | 蜜桃视频插满18在线观看 | 国产亚洲美女精品久久久2020 | 色欲综合久久中文字幕网 | 久久这里只有精品视频9 | 久久综合久久自在自线精品自 | v一区无码内射国产 | 久久亚洲中文字幕无码 | 欧美野外疯狂做受xxxx高潮 | 男人的天堂av网站 | 99麻豆久久久国产精品免费 | 亚洲色在线无码国产精品不卡 | 国産精品久久久久久久 | 乱码午夜-极国产极内射 | 国内精品人妻无码久久久影院 | 国产福利视频一区二区 | 自拍偷自拍亚洲精品被多人伦好爽 | 久久精品人妻少妇一区二区三区 | 色偷偷人人澡人人爽人人模 | 图片小说视频一区二区 | 国产午夜亚洲精品不卡 | 精品国产成人一区二区三区 | 天天摸天天透天天添 | 国产亚洲精品久久久久久 | 99久久人妻精品免费一区 | 97夜夜澡人人爽人人喊中国片 | 图片小说视频一区二区 | 国产高清不卡无码视频 | 亚洲狠狠色丁香婷婷综合 | 亚洲人成影院在线观看 | 国产在线aaa片一区二区99 | 黑人巨大精品欧美一区二区 | 国产精品久久精品三级 | 亚洲中文字幕久久无码 | 国产精品福利视频导航 | 国产又爽又黄又刺激的视频 | 人人妻人人澡人人爽精品欧美 | 亚洲va中文字幕无码久久不卡 | 中文字幕中文有码在线 | 高潮毛片无遮挡高清免费视频 | 国産精品久久久久久久 | 国产免费无码一区二区视频 | 天天做天天爱天天爽综合网 | 国产猛烈高潮尖叫视频免费 | 国产精品高潮呻吟av久久 | 亚洲中文字幕无码中字 | 一个人看的www免费视频在线观看 | 亚洲欧美日韩国产精品一区二区 | 色五月丁香五月综合五月 | 人人澡人人妻人人爽人人蜜桃 | 国产成人精品一区二区在线小狼 | 四虎影视成人永久免费观看视频 | 国产综合久久久久鬼色 | 亚洲午夜福利在线观看 | 精品水蜜桃久久久久久久 | 国产精品爱久久久久久久 | 永久免费精品精品永久-夜色 | 久久精品无码一区二区三区 | 精品国产一区二区三区av 性色 | 嫩b人妻精品一区二区三区 | 99久久久无码国产aaa精品 | 国产精品久久久久久久9999 | 天堂在线观看www | 亚洲综合久久一区二区 | 亚拍精品一区二区三区探花 | 极品嫩模高潮叫床 | 国产成人午夜福利在线播放 | 中文字幕av无码一区二区三区电影 | 欧美日韩综合一区二区三区 | 国产激情艳情在线看视频 | 帮老师解开蕾丝奶罩吸乳网站 | 无码一区二区三区在线观看 | 欧美日韩一区二区免费视频 | 国产精品二区一区二区aⅴ污介绍 | 国产农村妇女高潮大叫 | 中文字幕无码乱人伦 | 国产精品嫩草久久久久 | 老司机亚洲精品影院 | 国产午夜福利亚洲第一 | 精品人妻人人做人人爽夜夜爽 | 又紧又大又爽精品一区二区 | 欧美野外疯狂做受xxxx高潮 | 丝袜足控一区二区三区 | 少妇无套内谢久久久久 | 扒开双腿吃奶呻吟做受视频 | 99久久亚洲精品无码毛片 | 欧美 亚洲 国产 另类 | 色综合久久88色综合天天 | 东京热一精品无码av | 色妞www精品免费视频 | 久久综合久久自在自线精品自 | 亚洲精品一区二区三区在线观看 | 日本大乳高潮视频在线观看 | av香港经典三级级 在线 | 久久精品无码一区二区三区 | 亚洲一区二区三区播放 | 国产成人一区二区三区别 | 午夜精品久久久久久久 | 国产精品久久久久久亚洲影视内衣 | 亚洲另类伦春色综合小说 | 国产亚洲精品久久久久久久 | 中文字幕色婷婷在线视频 | 97夜夜澡人人爽人人喊中国片 | 亚洲精品一区二区三区在线 | 亚洲自偷自拍另类第1页 | 内射后入在线观看一区 | 亚洲精品一区三区三区在线观看 | 国产av一区二区三区最新精品 | 成人欧美一区二区三区黑人 | 精品一区二区三区波多野结衣 | 强开小婷嫩苞又嫩又紧视频 | 久久国产精品_国产精品 | 未满成年国产在线观看 | 丰满人妻被黑人猛烈进入 | 中国大陆精品视频xxxx | 亚洲熟妇色xxxxx亚洲 | 国产精品无码一区二区三区不卡 | 国产精品久久国产精品99 | 天堂亚洲2017在线观看 | 久久久久久九九精品久 | 色综合久久中文娱乐网 | 国产av剧情md精品麻豆 | 午夜理论片yy44880影院 | 欧美日韩色另类综合 | 精品无码一区二区三区爱欲 | 2019午夜福利不卡片在线 | 精品无人国产偷自产在线 | 国产色精品久久人妻 | 日韩无码专区 | 黄网在线观看免费网站 | 亚洲 另类 在线 欧美 制服 | 人人爽人人爽人人片av亚洲 | 少妇久久久久久人妻无码 | 国产亲子乱弄免费视频 | 国产真人无遮挡作爱免费视频 | 乱码午夜-极国产极内射 | 久久久精品欧美一区二区免费 | 18无码粉嫩小泬无套在线观看 | 娇妻被黑人粗大高潮白浆 | 东京热一精品无码av | 亚洲欧洲无卡二区视頻 | 亚洲欧美日韩国产精品一区二区 | 亚洲春色在线视频 | 一本色道久久综合狠狠躁 | 久久国语露脸国产精品电影 | 亚洲精品午夜无码电影网 | 亚洲а∨天堂久久精品2021 | 在教室伦流澡到高潮hnp视频 | 久久久久久久久888 | 欧洲熟妇精品视频 | 性欧美大战久久久久久久 | 蜜桃视频韩日免费播放 | 精品人妻中文字幕有码在线 | 精品久久久中文字幕人妻 | 欧美日韩综合一区二区三区 | 国产凸凹视频一区二区 | 蜜臀av在线播放 久久综合激激的五月天 | 日本护士xxxxhd少妇 | 自拍偷自拍亚洲精品10p | 大地资源网第二页免费观看 | 国精品人妻无码一区二区三区蜜柚 | 好男人社区资源 | 久久午夜无码鲁丝片 | 98国产精品综合一区二区三区 | 最近免费中文字幕中文高清百度 | 激情内射亚州一区二区三区爱妻 | 动漫av网站免费观看 | 人妻插b视频一区二区三区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 综合网日日天干夜夜久久 | 国产超级va在线观看视频 | 欧美熟妇另类久久久久久多毛 | 国产成人无码av片在线观看不卡 | 亚洲色欲色欲天天天www | 黑人玩弄人妻中文在线 | 精品无码一区二区三区爱欲 | 久久精品国产精品国产精品污 | 丁香花在线影院观看在线播放 | 在线观看欧美一区二区三区 | 任你躁国产自任一区二区三区 | 久久久久亚洲精品男人的天堂 | 帮老师解开蕾丝奶罩吸乳网站 | 疯狂三人交性欧美 | 国产又爽又猛又粗的视频a片 | 在线观看免费人成视频 | 亚洲 另类 在线 欧美 制服 | 久久五月精品中文字幕 | 一本久道高清无码视频 | 中文字幕+乱码+中文字幕一区 | 欧美精品在线观看 | 精品无码国产一区二区三区av | 久久www免费人成人片 | 美女极度色诱视频国产 | 97夜夜澡人人爽人人喊中国片 | 日韩在线不卡免费视频一区 | 成人性做爰aaa片免费看 | 最近中文2019字幕第二页 | 黑人玩弄人妻中文在线 | 牲欲强的熟妇农村老妇女 | 国产精品久久久久久亚洲影视内衣 | 大乳丰满人妻中文字幕日本 | av无码电影一区二区三区 | 丝袜 中出 制服 人妻 美腿 | 18精品久久久无码午夜福利 | 亚洲自偷自拍另类第1页 | 蜜臀av无码人妻精品 | 国产精品久久福利网站 | 内射爽无广熟女亚洲 | 成熟女人特级毛片www免费 | 亚洲综合伊人久久大杳蕉 | 狠狠色丁香久久婷婷综合五月 | 少妇太爽了在线观看 | 亚洲性无码av中文字幕 | 成 人影片 免费观看 | 大色综合色综合网站 | 无码吃奶揉捏奶头高潮视频 | 国产精品亚洲а∨无码播放麻豆 | 日韩视频 中文字幕 视频一区 | 中文久久乱码一区二区 | 色婷婷欧美在线播放内射 | 欧美丰满少妇xxxx性 | 亚洲成色www久久网站 | 最新国产乱人伦偷精品免费网站 | 欧美三级不卡在线观看 | 免费人成在线视频无码 | 亚洲国产精品毛片av不卡在线 | 蜜桃臀无码内射一区二区三区 | 性做久久久久久久免费看 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产精品福利视频导航 | 亚洲成av人影院在线观看 | 熟女少妇在线视频播放 | 国产精品内射视频免费 | 国产人妻精品午夜福利免费 | 午夜精品久久久久久久久 | 中文精品久久久久人妻不卡 | 亚洲色欲色欲欲www在线 | 国产人妻人伦精品1国产丝袜 | 少妇的肉体aa片免费 | 永久免费观看国产裸体美女 | 成熟人妻av无码专区 | 中文字幕乱码亚洲无线三区 | 国产口爆吞精在线视频 | 中文字幕av无码一区二区三区电影 | 国产精品久久久久9999小说 | 国产成人无码a区在线观看视频app | 亚洲爆乳精品无码一区二区三区 | 伊在人天堂亚洲香蕉精品区 | 久久精品人妻少妇一区二区三区 | 国产精品美女久久久网av | 男女超爽视频免费播放 | 波多野结衣av在线观看 | 国产深夜福利视频在线 | 在线欧美精品一区二区三区 | 狂野欧美性猛交免费视频 | 国产精品美女久久久久av爽李琼 | 亚洲の无码国产の无码影院 | 日韩人妻少妇一区二区三区 | 人妻中文无码久热丝袜 | 午夜精品久久久久久久 | 97久久国产亚洲精品超碰热 | 99er热精品视频 | 国产成人综合在线女婷五月99播放 | 初尝人妻少妇中文字幕 | 国产成人综合在线女婷五月99播放 | 国产激情无码一区二区 | 色偷偷人人澡人人爽人人模 | 国产三级精品三级男人的天堂 | 久久精品一区二区三区四区 | 真人与拘做受免费视频 | 好屌草这里只有精品 | 精品国产麻豆免费人成网站 | 日韩精品无码免费一区二区三区 | 牲欲强的熟妇农村老妇女 | 久久精品国产精品国产精品污 | 狠狠色欧美亚洲狠狠色www | 好男人社区资源 | 蜜臀av在线播放 久久综合激激的五月天 | 久久久无码中文字幕久... | 99re在线播放 | 又大又硬又黄的免费视频 | 亚洲精品一区二区三区四区五区 | 国产成人人人97超碰超爽8 | 亚洲精品综合五月久久小说 | 午夜精品一区二区三区的区别 | 最新版天堂资源中文官网 | 在线a亚洲视频播放在线观看 | 欧美老人巨大xxxx做受 | 偷窥日本少妇撒尿chinese | 无码人妻精品一区二区三区下载 | 久久久久久久久888 | 国产综合久久久久鬼色 | 国产精品久久久久7777 | 国产av剧情md精品麻豆 | 亚洲精品久久久久avwww潮水 | 在线观看欧美一区二区三区 | 国内精品久久毛片一区二区 | 少妇性l交大片欧洲热妇乱xxx | 18禁黄网站男男禁片免费观看 | 日韩成人一区二区三区在线观看 | 免费乱码人妻系列无码专区 | 午夜精品久久久内射近拍高清 | 国产亚洲欧美日韩亚洲中文色 | 国产肉丝袜在线观看 | 一本久道久久综合婷婷五月 | 国内老熟妇对白xxxxhd | 露脸叫床粗话东北少妇 | 亚洲中文无码av永久不收费 | 欧美成人免费全部网站 | 最近免费中文字幕中文高清百度 | 久久国语露脸国产精品电影 | 人妻aⅴ无码一区二区三区 | 日日碰狠狠躁久久躁蜜桃 | 日本精品久久久久中文字幕 | www国产亚洲精品久久网站 | 久久久精品456亚洲影院 | 国产色精品久久人妻 | 亚洲精品美女久久久久久久 | 377p欧洲日本亚洲大胆 | 99久久久无码国产aaa精品 | 狠狠色色综合网站 | 国产香蕉97碰碰久久人人 | 天堂无码人妻精品一区二区三区 | 国产三级精品三级男人的天堂 | 国产手机在线αⅴ片无码观看 | 国产一区二区三区四区五区加勒比 | 国产亚洲精品久久久久久久 | 日日橹狠狠爱欧美视频 | 97色伦图片97综合影院 | 少妇性俱乐部纵欲狂欢电影 | 久久亚洲精品中文字幕无男同 | 国产精品第一国产精品 | 中文字幕无码av波多野吉衣 | 精品国产一区二区三区四区 | 波多野结衣高清一区二区三区 | 丝袜美腿亚洲一区二区 | 久久婷婷五月综合色国产香蕉 | 久久综合九色综合97网 | 亚洲国产午夜精品理论片 | 日日天日日夜日日摸 | 国产麻豆精品精东影业av网站 | 亚洲国产av美女网站 | 欧美日韩一区二区免费视频 | 少妇性俱乐部纵欲狂欢电影 | 久久久久久九九精品久 | 婷婷丁香六月激情综合啪 | 国产精品沙发午睡系列 | 牲欲强的熟妇农村老妇女 | 亚洲日韩一区二区 | 色老头在线一区二区三区 | 日本精品久久久久中文字幕 | 无码人妻丰满熟妇区五十路百度 | 久久综合久久自在自线精品自 | 国产精品高潮呻吟av久久 | 日韩少妇白浆无码系列 | 欧美乱妇无乱码大黄a片 | 岛国片人妻三上悠亚 | 98国产精品综合一区二区三区 | 又色又爽又黄的美女裸体网站 | 六十路熟妇乱子伦 | 97人妻精品一区二区三区 | 国内少妇偷人精品视频免费 | 丁香啪啪综合成人亚洲 | 精品aⅴ一区二区三区 | v一区无码内射国产 | 国内综合精品午夜久久资源 | ass日本丰满熟妇pics | 青青草原综合久久大伊人精品 | 麻豆av传媒蜜桃天美传媒 | 国产精品人人妻人人爽 | 97夜夜澡人人双人人人喊 | 国产精品美女久久久久av爽李琼 | 亚洲中文字幕无码中文字在线 | 精品国产一区av天美传媒 | 国产麻豆精品精东影业av网站 | 中文字幕乱码中文乱码51精品 | 国产97人人超碰caoprom | 欧美喷潮久久久xxxxx | 亚洲最大成人网站 | 性啪啪chinese东北女人 | 欧美第一黄网免费网站 | 男人和女人高潮免费网站 | 欧美日韩色另类综合 | 台湾无码一区二区 | 啦啦啦www在线观看免费视频 | 国产精品亚洲一区二区三区喷水 | 久久久久久国产精品无码下载 | 人人超人人超碰超国产 | 欧美国产日产一区二区 | 久久精品国产大片免费观看 | 国内综合精品午夜久久资源 | 精品无人区无码乱码毛片国产 | 伊人久久大香线蕉av一区二区 | 亚洲成av人综合在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 人人澡人人妻人人爽人人蜜桃 | 国产一区二区三区四区五区加勒比 | 国产小呦泬泬99精品 | 国产av一区二区三区最新精品 | 一本大道久久东京热无码av | 蜜桃av抽搐高潮一区二区 | 国产精品久久福利网站 | 美女张开腿让人桶 | 欧美日韩久久久精品a片 | 一本精品99久久精品77 | 国产一区二区三区影院 | 波多野结衣乳巨码无在线观看 | 免费无码的av片在线观看 | 亚洲欧美日韩综合久久久 | 国模大胆一区二区三区 | 日本精品人妻无码77777 天堂一区人妻无码 | 好屌草这里只有精品 | 精品日本一区二区三区在线观看 | 狂野欧美性猛交免费视频 | 一本大道久久东京热无码av | 中文字幕中文有码在线 | 377p欧洲日本亚洲大胆 | 亚洲 激情 小说 另类 欧美 | 乱中年女人伦av三区 | 2020久久超碰国产精品最新 | 少妇厨房愉情理9仑片视频 | 帮老师解开蕾丝奶罩吸乳网站 | 欧洲极品少妇 | 精品无人区无码乱码毛片国产 | 乱中年女人伦av三区 | 国产偷自视频区视频 | 日韩精品成人一区二区三区 | 免费无码av一区二区 | 国产精品久久久av久久久 | 久久久av男人的天堂 | 强辱丰满人妻hd中文字幕 | 国产xxx69麻豆国语对白 | aa片在线观看视频在线播放 | 又大又硬又爽免费视频 | 67194成是人免费无码 | 午夜性刺激在线视频免费 | 国内精品人妻无码久久久影院 | 欧美 日韩 人妻 高清 中文 | 正在播放老肥熟妇露脸 | 婷婷五月综合缴情在线视频 | 国产九九九九九九九a片 | 四虎影视成人永久免费观看视频 | 国产黑色丝袜在线播放 | 任你躁在线精品免费 | 日本精品少妇一区二区三区 | 国产精品永久免费视频 | 无码国模国产在线观看 | 真人与拘做受免费视频 | 性欧美熟妇videofreesex | 欧美成人免费全部网站 | 最新国产麻豆aⅴ精品无码 | 四虎国产精品一区二区 | 久久久精品欧美一区二区免费 | 日本乱偷人妻中文字幕 | 国产成人综合色在线观看网站 | 成人精品视频一区二区三区尤物 | 欧洲美熟女乱又伦 | 乱人伦人妻中文字幕无码久久网 | 亚洲国精产品一二二线 | 波多野结衣乳巨码无在线观看 | 亚洲阿v天堂在线 | 久久天天躁狠狠躁夜夜免费观看 | 国产精品va在线播放 | 六月丁香婷婷色狠狠久久 | 欧美一区二区三区视频在线观看 | 乱人伦人妻中文字幕无码久久网 | 久久久精品456亚洲影院 | av香港经典三级级 在线 | 亚洲成a人片在线观看日本 | 人人澡人摸人人添 | 男女作爱免费网站 | 波多野结衣av一区二区全免费观看 | 又大又黄又粗又爽的免费视频 | 中文精品无码中文字幕无码专区 | 狠狠色噜噜狠狠狠7777奇米 | 小sao货水好多真紧h无码视频 | 久久久中文久久久无码 | 97夜夜澡人人爽人人喊中国片 | 牲欲强的熟妇农村老妇女视频 | 人人爽人人爽人人片av亚洲 | av人摸人人人澡人人超碰下载 | 成人性做爰aaa片免费看不忠 | 国产suv精品一区二区五 | 永久免费观看美女裸体的网站 | 亚洲一区二区三区无码久久 | 欧美xxxx黑人又粗又长 | 国产香蕉尹人视频在线 | 无码人妻精品一区二区三区下载 | 无码人妻少妇伦在线电影 | 日日躁夜夜躁狠狠躁 | 亚洲精品中文字幕乱码 | 99精品久久毛片a片 | 少妇高潮喷潮久久久影院 | 国产成人无码a区在线观看视频app | 国产成人无码av在线影院 | 在线看片无码永久免费视频 | 在线观看国产一区二区三区 | 97夜夜澡人人双人人人喊 | 久久久久亚洲精品中文字幕 | 欧洲熟妇精品视频 | 少妇激情av一区二区 | 国产无遮挡又黄又爽又色 | 少妇厨房愉情理9仑片视频 | 51国偷自产一区二区三区 | 亚洲一区二区三区香蕉 | 乌克兰少妇xxxx做受 | 日本精品人妻无码77777 天堂一区人妻无码 | 在线播放免费人成毛片乱码 | 美女张开腿让人桶 | 欧美成人家庭影院 | 狠狠综合久久久久综合网 | 99久久人妻精品免费二区 | 精品久久综合1区2区3区激情 | 色婷婷av一区二区三区之红樱桃 | 欧美阿v高清资源不卡在线播放 | 大乳丰满人妻中文字幕日本 | 亚洲s码欧洲m码国产av | 日韩少妇白浆无码系列 | 国产suv精品一区二区五 | 综合激情五月综合激情五月激情1 | 色 综合 欧美 亚洲 国产 | 丰满肥臀大屁股熟妇激情视频 | 在线视频网站www色 | 国产极品美女高潮无套在线观看 | 精品国产麻豆免费人成网站 | 成人三级无码视频在线观看 | 国产卡一卡二卡三 | 亚洲国产精品成人久久蜜臀 | 久久99国产综合精品 | 婷婷五月综合缴情在线视频 | 免费观看激色视频网站 | 在线精品国产一区二区三区 | 中文字幕无码热在线视频 | 在线观看国产一区二区三区 | 欧美老人巨大xxxx做受 | 国产精品人人爽人人做我的可爱 | 性欧美牲交在线视频 | 国产精品久久久久久亚洲毛片 | 高潮毛片无遮挡高清免费视频 | 麻豆成人精品国产免费 | 日韩在线不卡免费视频一区 | 国产亚洲精品久久久闺蜜 | 水蜜桃色314在线观看 | 国产精品国产自线拍免费软件 | 中文字幕无码热在线视频 | 日产国产精品亚洲系列 | 中国女人内谢69xxxxxa片 | 人人澡人人透人人爽 | 国产亚洲精品久久久久久久久动漫 | 国产欧美亚洲精品a | 国产亚洲人成在线播放 | 国产午夜无码精品免费看 | 国产熟女一区二区三区四区五区 | 亚洲男人av天堂午夜在 | 国精品人妻无码一区二区三区蜜柚 | √8天堂资源地址中文在线 | 欧美日韩综合一区二区三区 | 内射巨臀欧美在线视频 | 亚洲精品久久久久久久久久久 | 亚洲国产精品一区二区第一页 | 日本高清一区免费中文视频 | 无码中文字幕色专区 | 夫妻免费无码v看片 | 国产综合在线观看 | 2020久久香蕉国产线看观看 | 高中生自慰www网站 | 一本色道久久综合亚洲精品不卡 | 亚洲综合精品香蕉久久网 | 亚洲va欧美va天堂v国产综合 | 鲁鲁鲁爽爽爽在线视频观看 | 久久久中文字幕日本无吗 | 久久久久av无码免费网 | 日日天干夜夜狠狠爱 | 国产午夜亚洲精品不卡 | 久久精品无码一区二区三区 | 精品无码国产一区二区三区av | 任你躁在线精品免费 | 国产无遮挡吃胸膜奶免费看 | 国产精品久久久午夜夜伦鲁鲁 | 国产av一区二区精品久久凹凸 | 少妇人妻偷人精品无码视频 | 野外少妇愉情中文字幕 | 内射爽无广熟女亚洲 | 一本久道久久综合婷婷五月 | 无码人妻丰满熟妇区五十路百度 | 清纯唯美经典一区二区 | 精品国产福利一区二区 | 中文字幕av日韩精品一区二区 | 自拍偷自拍亚洲精品被多人伦好爽 | 色一情一乱一伦一视频免费看 | 国产精品多人p群无码 | 色综合久久88色综合天天 | 国产热a欧美热a在线视频 | 午夜福利不卡在线视频 | 亚洲色偷偷男人的天堂 | 国产精品99久久精品爆乳 | 熟女少妇在线视频播放 | 1000部啪啪未满十八勿入下载 | 日本欧美一区二区三区乱码 | 久久精品中文字幕大胸 | 亚洲色大成网站www国产 | 国产 精品 自在自线 | 人人超人人超碰超国产 | 国产舌乚八伦偷品w中 | 日日噜噜噜噜夜夜爽亚洲精品 | 午夜精品久久久内射近拍高清 | 99国产精品白浆在线观看免费 | 日本乱人伦片中文三区 | 欧美老熟妇乱xxxxx | 国精产品一品二品国精品69xx | 我要看www免费看插插视频 | 国产三级久久久精品麻豆三级 | 牲欲强的熟妇农村老妇女视频 | 国产在线精品一区二区三区直播 | 无码av最新清无码专区吞精 | av在线亚洲欧洲日产一区二区 | 亚洲爆乳精品无码一区二区三区 | 无遮挡国产高潮视频免费观看 | 两性色午夜免费视频 | 成 人 免费观看网站 | 久久久精品国产sm最大网站 | 国精产品一品二品国精品69xx | 丝袜 中出 制服 人妻 美腿 | 国产午夜福利100集发布 | 美女黄网站人色视频免费国产 | 欧美日本日韩 | 97久久国产亚洲精品超碰热 | 无码国内精品人妻少妇 | 丝袜人妻一区二区三区 | 国产精品怡红院永久免费 | 国产人妻人伦精品 | 无码精品人妻一区二区三区av | 亚洲熟妇色xxxxx欧美老妇y | 亚洲大尺度无码无码专区 | 少妇被粗大的猛进出69影院 | 亚洲综合无码一区二区三区 | 日本va欧美va欧美va精品 | 老熟女重囗味hdxx69 | 九九综合va免费看 | 兔费看少妇性l交大片免费 | 国产色精品久久人妻 | 无码人妻久久一区二区三区不卡 | 国产激情一区二区三区 | 精品久久综合1区2区3区激情 | 牲欲强的熟妇农村老妇女视频 | 日本一区二区三区免费高清 | 国产一区二区不卡老阿姨 | 久久久国产一区二区三区 | 国产精品福利视频导航 | 99久久久国产精品无码免费 | 国产疯狂伦交大片 | 精品国产aⅴ无码一区二区 | 国产suv精品一区二区五 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 小鲜肉自慰网站xnxx | 亚洲人成无码网www | www国产亚洲精品久久久日本 | 人人妻人人澡人人爽欧美精品 | 精品国产精品久久一区免费式 | 久久精品国产99精品亚洲 | 国产色xx群视频射精 | 午夜时刻免费入口 | 亚洲伊人久久精品影院 | 国产成人亚洲综合无码 | 毛片内射-百度 | 永久免费观看国产裸体美女 | 国产日产欧产精品精品app | 久久精品成人欧美大片 | 亚洲狠狠色丁香婷婷综合 | 色窝窝无码一区二区三区色欲 | 麻豆国产人妻欲求不满谁演的 | 久久亚洲中文字幕精品一区 | 综合网日日天干夜夜久久 | 亚洲一区av无码专区在线观看 | 久久精品视频在线看15 | 国产精品嫩草久久久久 | 中文毛片无遮挡高清免费 | 色一情一乱一伦一区二区三欧美 | 久久精品女人天堂av免费观看 | 久久久久99精品国产片 | 国产欧美精品一区二区三区 | 美女毛片一区二区三区四区 | 男女爱爱好爽视频免费看 | 国产亚洲人成a在线v网站 | 国产超碰人人爽人人做人人添 | 欧美日韩久久久精品a片 | 久久精品人妻少妇一区二区三区 | 亚洲一区二区三区国产精华液 | 狠狠噜狠狠狠狠丁香五月 | 青青青手机频在线观看 | 国产精品va在线观看无码 | 国产精品久久久久9999小说 | 理论片87福利理论电影 | 久久久成人毛片无码 | 丁香啪啪综合成人亚洲 | 1000部啪啪未满十八勿入下载 | 亚洲乱码国产乱码精品精 | 国产成人无码a区在线观看视频app | 四虎国产精品一区二区 | 精品久久久无码中文字幕 | 精品厕所偷拍各类美女tp嘘嘘 | 国内精品一区二区三区不卡 | 精品国产精品久久一区免费式 | 婷婷五月综合缴情在线视频 | 曰韩无码二三区中文字幕 | 久久国产精品偷任你爽任你 | 国产成人无码av一区二区 | 免费无码一区二区三区蜜桃大 | 亚洲精品国产精品乱码不卡 | 亚洲成av人综合在线观看 | 亚洲综合无码久久精品综合 |