編寫一個 HTTP 服務(wù)器,它只接受 POST 形式的請求,并且將 POST 請求主體(body)所帶的字符轉(zhuǎn)換成大寫形式,然后返回給客戶端。
服務(wù)器需要監(jiān)聽由第一個命令行參數(shù)所指定的端口。
這里將不限制你使用 stream 處理 request 和 response 對象,并且這將更為簡單。
在 npm 中,有很多不同的模塊可以用來在 stream 傳輸過程中 “轉(zhuǎn)換” stream 中的數(shù)據(jù)。對于本次練習來說,through2-map 這個模塊有一個比較簡單的 API 可以使用。
through2-map 允許你創(chuàng)建一個 transform stream,它僅需要一個函數(shù)就能完成「接收一個數(shù)據(jù)塊,處理完后返回這個數(shù)據(jù)塊」的功能 ,它的工作模式類似于 Array#map(),但是是針對 stream 的:
var map = require('through2-map')
inStream.pipe(map(function (chunk) {
return chunk.toString().split('').reverse().join('')
})).pipe(outStream)
在上面的例子中,從 inStream 傳進來的數(shù)據(jù)會被轉(zhuǎn)換成字符串(如果它不是字符串的話),并且字符會反轉(zhuǎn)處理,然后傳入 outStream。所以,我們這里是做了一個字符串反轉(zhuǎn)器!記??!盡管,數(shù)據(jù)塊(chunk)的大小是由上游(up-stream)所決定的,但是還是可以在這之上對傳進來的數(shù)據(jù)做一點小小的處理的。
要安裝 through2-map,輸入:
$ npm install 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]))
更多建議: