《了不起的 nodejs》中 TwitterWeb 案例 bug 解决

了不起的nodejs算是一本不错的入门书,不过书中个别案例存在bug,按照书中源码无法做出和书中相同效果,原本兴奋的心情掺杂着些许失落。

现在我们看一下第七章HTTP,一个 Twitter Web 客户端的例子。

先贴上书中源码

1.创建server.js

var qs = require('querystring');
require('http').createServer(function(req,res){
    var body ="";
    req.on('data',function(chunk){
        body += chunk;
    });
    req.on('end',function(){
        res.writeHead(200);
        res.end('Done');
        console.log('\n got name \033[90m' + qs.parse(body).name + '\033[39m\n');
        
    });
}).listen(3000);

2.创建client.js

var http = require('http'),
    qs = require('querystring');

function send (theName){
    http.request({
        host: '127.0.0.1',
        port: 3000,
        url: '/',
        method:'POST'
        },function(res){
            res.setEncoding('utf8');
            res.on('end',function(){
                console.log('\n  \033[90m  request complete!\033[39m' );
                process.stdout.write('\n your name: ');
            });
        }).end(qs.stringify({name: theName}));
}

process.stdout.write('\n your name: ');
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data',function(name){
    send(name.replace('\n', ''));
});

很遗憾,最后出来的结果是这样子

效果非常不理想

问题出在哪里呢,和源码一样啊?

其实只需要将 client.js 中发送用户名的回调函数修改一下就可以了。

var http = require('http'),
    qs = require('querystring');

function send (theName){
    http.request({
        host: '127.0.0.1',
        port: 3000,
        url: '/',
        method:'POST'
        },function(res){
            res.setEncoding('utf8');
            /*==========新增代码=========*/
            res.on("data",function(chunk){
                //console.log(chunk);
            });
            /*==========================*/
            res.on('end',function(){
                console.log('\n  \033[90m  request complete!\033[39m' );
                process.stdout.write('\n your name: ');
            });
        }).end(qs.stringify({name: theName}));
}

process.stdout.write('\n your name: ');
process.stdin.resume();
process.stdin.setEncoding('utf8');
process.stdin.on('data',function(name){
    send(name.replace('\n', ''));
});

最终结果就是这样子

是不是很酷,虽然是一个很简单的小例子,不过对于初学者来说还是很有成就感的!

posted @ 2016-08-03 14:22  叙帝利  阅读(607)  评论(2编辑  收藏  举报