## 要求
編寫一個 HTTP 服務器,它只接受 POST 形式的請求,并且將 POST 請求主體(body)所帶的字符轉換成大寫形式,然后返回給客戶端。
服務器需要監聽由第一個命令行參數所指定的端口。
## 提示
這里將不限制你使用 stream 處理 request 和 response 對象,并且這將更為簡單。
在 npm 中,有很多不同的模塊可以用來在 stream 傳輸過程中 “轉換” stream 中的數據。對于本次練習來說,through2-map 這個模塊有一個比較簡單的 API 可以使用。
through2-map 允許你創建一個 transform stream,它僅需要一個函數就能完成「接收一個數據塊,處理完后返回這個數據塊」的功能 ,它的工作模式類似于 Array#map(),但是是針對 stream 的:
~~~
var map = require('through2-map')
inStream.pipe(map(function (chunk) {
return chunk.toString().split('').reverse().join('')
})).pipe(outStream)
~~~
在上面的例子中,從 inStream 傳進來的數據會被轉換成字符串(如果它不是字符串的話),并且字符會反轉處理,然后傳入 outStream。所以,我們這里是做了一個字符串反轉器!記住!盡管,數據塊(chunk)的大小是由上游(up-stream)所決定的,但是還是可以在這之上對傳進來的數據做一點小小的處理的。
要安裝 through2-map,輸入:
~~~
$ npm install through2-map
~~~
[through2-map模塊API文檔](https://github.com/brycebaril/through2-map)
## 代碼
方法一:
~~~
var http = require('http');
http.createServer(function(req,res){
var postData = '';
req.addListener(“data”, function (postDataChunk) {
if(req.method==='POST'){
postData += postDataChunk;
}
});
req.addListener(“end”, function(){
if(req.method==='POST'){
res.end(postData.toUpperCase(),'utf8');
}
});
}).listen(process.argv[2]);
~~~
方法二:
~~~
var http = require('http')
var map = require('through2-map')
var server = http.createServer(function (req, res) {
if (req.method != 'POST')
return res.end('send me a POST\n')
req.pipe(map(function (chunk) {
return chunk.toString().toUpperCase()
})).pipe(res)
})
server.listen(Number(process.argv[2]))
~~~