nodejs基本点

来源:互联网 发布:syslog日志接受软件 编辑:程序博客网 时间:2024/04/30 01:45

一、require方法和exports对象

看下面的小例子
student.js

function add(student){    console.log("add student:"+student);}exports.add = add;

teacher.js

function add(teacher){    console.log("add teacher:"+teacher);}exports.add = add;

clazz.js

var student = require("./student");var teacher = require("./teacher");function add(teacherName, students){    teacher.add(teacherName);    students.forEach(function(item, index){        student.add(item);    });}exports.add = add

test.js

var kclazz = require('./clazz');kclazz.add("chm",['张三','李四','王五']);

关于require和exports以及exports和module.exports的知识在前面的文章html5 web相关有详细介绍。

http模块的request方法

下面是使用request方法给博客提交一个评论。注意,这里大家不要恶意灌水,否则账号可能被封。
自己给我博客下面的Android后台优化文章提交了一条测试评论。

var http = require("http");var querystring =require("querystring");//对象序列化成字符串var postData = querystring.stringify({    'content':'一条测试评论!',    'commentid':'',    'replyId':''});var options = {    hostname: 'blog.csdn.net',    port: 80,    path:'/zxc123w/comment/submit?id=52712831',    search: '?id=52712831',    method: 'POST',    headers: {        'Accept':'*/*',        'Accept-Encoding':'gzip, deflate',        'Accept-Language':'zh-CN,zh;q=0.8',        'Connection':'keep-alive',        'Content-Length':postData.length,        'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',        'Cookie':'bdshare_firstime=1474697719513; uuid_tt_dd=5967015093691172370_20160924; __message_district_code=330000; uuid=78c9be2e-5a6a-49b6-9b23-94cdb094e6cc; _gat=1; _ga=GA1.2.1990464495.1474710983; UserName=zxc123ew; UserInfo=%2BvvgYFMdtmXUKWYiF7BxXMuv166qvkztqA21%2FFo2wE5I8H9CQjTYoVq6p%2BS94uFGvMsYWRMEQRqOeEIzfI3inipUewoOH60%2FJ%2BNYURIQScSW2f5NKnUFJbemvtxrzu2h; UserNick=xxx; AU=FF9; UN=xxx; UE="xxx"; BT=1476083848179; access-token=83a6317a-10bf-4979-9fd2-745e61416494; avh=52712831; dc_tos=oetlqi; __message_sys_msg_id=0; __message_gu_msg_id=0; __message_cnel_msg_id=0; __message_in_school=0; dc_session_id=1476083845706',        'Host':'blog.csdn.net',        'Origin':'http://blog.csdn.net',        'Referer':'http://blog.csdn.net/zxc123e/article/details/52712831',        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',        'X-Requested-With':'XMLHttpRequest'    }};var req = http.request(options, function(res){    console.log('Status: '+res.statusCode);    console.log('headers: '+JSON.stringify(res.headers));    res.on("data", function(chunk){        console.log(Buffer.isBuffer(chunk));    })    res.on('end', function(){        console.log("评论完毕");    })});req.on("error", function(e){    console.log('Error: '+e.message);});req.write(postData);req.end();

代码里面我修改了cookie的一些信息,但是还要再次提醒大家不要恶意灌水。

EventEmitter类

events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。

var events = require("events");var server = new events.EventEmitter();//默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。setMaxListeners(11)server.on('say', function(who){    console.log(who+" say hello");});server.on('say', function(who){    console.log(who+" say 伐木累!");})server.on('eat', function(who){    console.log(who+" 吃饭");});server.emit('say', 'he');var callback = function(stream) {  console.log('someone connected!');};server.on('connection', callback);server.removeListener('connection', callback);server.emit('connection');console.log(events.EventEmitter.listenerCount(server, 'say'));

Stream和Buffer

Stream(流)

Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。

Node.js,Stream 有四种流类型:

  • Readable - 可读操作。
  • Writable - 可写操作。
  • Duplex - 可读可写操作.
  • Transform - 操作被写入数据,然后读出结果。

所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:

  • data - 当有数据可读时触发。
  • end - 没有更多的数据可读时触发。
  • error - 在接收和写入过程中发生错误时触发。
  • finish - 所有数据已被写入到底层系统时触发。

Buffer(缓冲区)

Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。

Promise

nodejs的最大的优点是高并发,适合适合I/O密集型应用。但是这带来的问题是异步操作和函数回调,你会需要在一个动作完成之后继续做别的动作,因此回调会不断的嵌套。你会发现很快这些代码就很难阅读了,更别提维护了。于是,Promise应运而生。Promise表示一个异步操作的最终结果。与Promise最主要的交互方法是通过将函数传入它的then方法从而获取得Promise最终的值或Promise最终最拒绝(reject)的原因。

下面是一个页面上三个小球移动的动画效果。

<!DOCTYPE html><html><head>    <title>Promise</title><style type="text/css">    .ball {        width: 40px;        height: 40px;        border-radius: 20px;    }    .ball1 {        background-color: red;    }    .ball2 {        background-color: yellow;    }    .ball3 {        background-color: green;    }</style><script type="text/javascript" src="../node_modules/bluebird/js/browser/bluebird.js"></script></head><body>    <div class="ball ball1" style="margin-left: 0;"></div>    <div class="ball ball2" style="margin-left: 0;"></div>    <div class="ball ball3" style="margin-left: 0;"></div>    <script type="text/javascript">        var ball1 = document.querySelector('.ball1');        var ball2 = document.querySelector('.ball2');        var ball3 = document.querySelector('.ball3');        /*function animate(ball, distance, cb)        {            setTimeout(function(){                var marginLeft = parseInt(ball.style.marginLeft, 10);                if (marginLeft === distance) {                    cb&&cb();                }else{                    if (marginLeft < distance)                    {                        marginLeft++;                    }else{                        marginLeft--;                    }                    ball.style.marginLeft = marginLeft+'px';                    animate(ball, distance, cb);                }            }, 13);        }        animate(ball1, 100, function(){            animate(ball2,200, function(){                animate(ball3, 300, function(){                    animate(ball3, 150, function(){                        animate(ball2,150, function(){                            animate(ball1,150, function(){                            });                        });                    });                });            });        });*/        var Promise = window.Promise;        function promiseAnimate(ball, distance)        {            return new Promise(function(resolve, reject){                function _animate()                {                    setTimeout(function(){                        var marginLeft = parseInt(ball.style.marginLeft, 10);                        if (marginLeft === distance) {                            resolve();                            return;                        }else{                            if (marginLeft < distance)                            {                                marginLeft++;                            }else{                                marginLeft--;                            }                            ball.style.marginLeft = marginLeft+'px';                            _animate();                        }                    }, 13);                }                //第一次启动                _animate();            });        }        promiseAnimate(ball1, 100)            .then(function(){                return promiseAnimate(ball2, 200);            })            .then(function(){                return promiseAnimate(ball3, 300);            })            .then(function(){                return promiseAnimate(ball3, 150);            })            .then(function(){                return promiseAnimate(ball2, 150);            })            .then(function(){                return promiseAnimate(ball1, 150);            });    </script></body></html>

promise是一个标准,它描述了异步调用的返回结果,包括正确返回结果和错误处理。关于详细的说明文档可以参考 Promises/A+ 。目前实现 promise 标准的模块有很多,如 Q 、 bluebird 和 Deferred。这里我们使用的bluebird。新版nodejs中也有这个模块。

0 0