標籤:utf8 簡單的 eth web用戶端 node res stdout pos log
了不起的nodejs算是一本不錯的入門書,不過書中個別案例存在bug,按照書中源碼無法做出和書中相同效果,原本興奮的心情摻雜著些許失落。
現在我們看一下第七章HTTP,一個Twitter Web用戶端的例子。
先貼上書中源碼
1.建立server.js
1 var qs = require(‘querystring‘); 2 require(‘http‘).createServer(function(req,res){ 3 var body =""; 4 req.on(‘data‘,function(chunk){ 5 body += chunk; 6 }); 7 req.on(‘end‘,function(){ 8 res.writeHead(200); 9 res.end(‘Done‘);10 console.log(‘\n got name \033[90m‘ + qs.parse(body).name + ‘\033[39m\n‘);11 12 });13 }).listen(3000);
2.建立client.js
1 var http = require(‘http‘), 2 qs = require(‘querystring‘); 3 4 function send (theName){ 5 http.request({ 6 host: ‘127.0.0.1‘, 7 port: 3000, 8 url: ‘/‘, 9 method:‘POST‘10 },function(res){11 res.setEncoding(‘utf8‘);12 res.on(‘end‘,function(){13 console.log(‘\n \033[90m request complete!\033[39m‘ );14 process.stdout.write(‘\n your name: ‘);15 });16 }).end(qs.stringify({name: theName}));17 }18 19 process.stdout.write(‘\n your name: ‘);20 process.stdin.resume();21 process.stdin.setEncoding(‘utf8‘);22 process.stdin.on(‘data‘,function(name){23 send(name.replace(‘\n‘, ‘‘));24 })
很遺憾,最後出來的結果是這樣子
效果非常不理想
問題出在哪裡呢,和源碼一樣啊?
哈哈,其實只需要將 client.js 中發送使用者名稱的回呼函數修改一下就可以了。
1 var http = require(‘http‘), 2 qs = require(‘querystring‘); 3 4 function send (theName){ 5 http.request({ 6 host: ‘127.0.0.1‘, 7 port: 3000, 8 url: ‘/‘, 9 method:‘POST‘10 },function(){11 // res.setEncoding(‘utf8‘);12 // res.on(‘end‘,function(){13 console.log(‘\n \033[90m request complete!\033[39m‘ );14 process.stdout.write(‘\n your name: ‘);15 // });16 }).end(qs.stringify({name: theName}));17 }18 19 process.stdout.write(‘\n your name: ‘);20 process.stdin.resume();21 process.stdin.setEncoding(‘utf8‘);22 process.stdin.on(‘data‘,function(name){23 send(name.replace(‘\n‘, ‘‘));24 })
最終結果就是這樣子
是不是很酷,雖然是一個很簡單的小例子,不過對於初學者來說還是很有成就感的!
《了不起的 nodejs》中 TwitterWeb 案例 bug 解決