## 要求
編寫一個 HTTP 文件 服務器,它用于將每次所請求的文件返回給客戶端。
服務器需要監聽所提供的第一個命令行參數所制定的端口。
同時,第二個會提供給程序的參數則是所需要響應的文本文件的位置。在這一題中必須使用`fs.createReadStream()`?方法以 stream 的形式作出請求相應。
## 提示
由于我們需要創建的是一個 HTTP 服務而不是普通的 TCP 服務,因此,應該使用 http 這個 Node 核心模塊。它和 net 模塊類似,http 模塊擁有一個叫做?`http.createServer()`?的方法,所不同的是它所創建的服務器是用 HTTP 協議進行通信的。
`http.createServer()`接收一個回調函數作為參數,回調函數會在你的服務器每一次進行連接的時候執行,這個回調函數有以下的特征:
~~~
function callback (request, response) { /* ... */ }
~~~
在這里,這兩個參數是代表一個 HTTP 請求以及相應的響應的兩個對象。request 用來從請求中獲取一些的屬性,例如請求頭和查詢字符(query-string),而 response 會發送數據給客戶端,包括響應頭部和響應主體。
request 和 response 也都是 Node stream!這意味著,如果需要的話,可以使用流式處理(streaming)所抽象的那些方法來實現發送和接收數據。
`http.createServer()`?會返回一個 HTTP 服務器的實例。這里需要調用 server.listen(portNumber) 方法去監聽一個特定的端口。
一個典型的 Node HTTP 服務器將會是這個樣子:
~~~
var http = require('http')
var server = http.createServer(function (req, res) {
// 處理請求的邏輯...
})
server.listen(8000)
~~~
[http模塊API文檔](https://nodejs.org/api/http.html)
[fs模塊API文檔](https://nodejs.org/api/fs.html)
fs 這個核心模塊也含有一些用來處理文件的流式(stream) API。可以使用 fs.createReadStream() 方法來為命令行參數指定的文件創建一個 stream。這個方法會返回一個 stream 對象,該對象可以使用類似 src.pipe(dst) 的語法把數據從 src流傳輸(pipe) 到 dst 流中。通過這種形式,可以輕松地把一個文件系統的 stream 和一個 HTTP 響應的 stream 連接起來。
## 代碼
~~~
var http = require('http')
var fs = require('fs')
var server = http.createServer(function (req, res) {
res.writeHead(200, { 'content-type': 'text/plain' })
fs.createReadStream(process.argv[3]).pipe(res)
})
server.listen(Number(process.argv[2]))
~~~