第3章 Node编程基础

来源:互联网 发布:软件开发个人年终总结 编辑:程序博客网 时间:2024/05/16 15:52

3.1 Node功能的组织及重用

3.1.1 创建模块
模块即可能是一个文件,也可能是包含一个或多个文件的目录。如果模块是个目录,Node通常会在这个目录下找一个叫index.js的文件作为模块的入口(默认设置可以重写)。
典型的模块是一个包含exports对象属性定义的文件,这些属性可以是任意类型的数据。
使用这个新模块要用到Node的require函数,该函数以你要用的模块的路径为参数。Node以同步的方式寻找它,定位到这个模块并加载文件中的内容。

3.1.2 用module.exports微调模块的创建

3.1.3 用node_modules重用模块
这里写图片描述

3.1.4 注意事项
第一:如果模块是目录,在模块目录中定义模块的文件必须被命名为index.js,除非你在这个目录下一个叫package.json的文件里特别指明。
这里写图片描述

3.2 异步编程技术
回调通常用来定义一次性响应的逻辑。
事件监听器,本质上也是一个回调,不同的是,它跟一个概念实体(事件)想关联。

server.on('request',handleRequest)//每当有请求事件发生时,服务器就会调用handleRequest函数

一个Node HTTP服务器实例就是一个事件发射器,一个可以继承、能够添加事件发射及处理能力的类。

3.2.1 用回调处理一次性事件
回调是一个函数,它被当做参数传给异步函数,它描述了异步操作完成之后要做什么。

在简单的程序中使用回调的例子

titles.json

[        "Kazakhstan is a huge cuonutry...what goes on there?",        "This weather is making me craaazy",        "My neighbor sort of howls at night"]

template.html

<!doctype html><html>    <head></head>    <body>        <h1>Latest Posts</h1>        <ul>            <li>%</li>        </ul>    </body></html>

blog_recent.js

var http = require('http');var fs = require('fs');http.createServer(function(req,res){    if (req.url == '/') {        fs.readFile('./titles.json',function(err,data){            if(err) {                console.error(err);                res.end('Server Error');            }            else {                var titles = JSON.parse(data.toString());                console.log(titles);                fs.readFile('./template.html',function(err,data){                    if(err) {                        console.error(err);                        res.end('Server Error');                    }                    else {                        var tmpl = data.toString();                        console.log(titles.join('</li></li>'));                        var html = tmpl.replace('%',titles.join('</li><li>'));                        res.writeHead(200,{'Content-Type':'text/html'});                        res.end(html);                    }                });            }        });    }}).listen(8000,"127.0.0.1");
//创建中间函数以减少嵌套的例子var http = require('http');var fs = require('fs');//客户端请求-开始会进到这里var server = http.createServer(function(req,res){    getTitles(res);//控制权转交给了getTitles}).listen(8000,"127.0.0.1");//获取标题,并将控制权转交给getTemplatefunction getTitles(res) {    fs.readFile('./titles.json',function(err,data){        if(err) {            hadError(err,res);        } else {            getTemplate(JSON.parse(data.toString()),res);        }    })}//getTemplate读取模板文件,并将控制权转交给formatHtmlfunction getTemplate(titles,res) {    fs.readFile('./template.html',function(err,data){        if(err) {            hadError(err,res);        }else {            formatHtml(titles,data.toString(),res);        }    })}//formatHtml得到标题和模板,渲染一个响应给客户端function formatHtml(titles,tmpl,res) {    var html = tmpl.replace('%',titles.join('</li><li>'));    res.writeHead(200,{'Content-Type':'text/html'});    res.end(html);}//如果这个过程中出现了错误,hadError会将错误输出到控制台,并给客户端返回“”function hadError(err,res) {    console.error(err);    res.end('Server Error');}

这里写图片描述

3.2.2 用事件发射器处理重复性事件
事件发射器会触发事件,并且在那些事件被触发时能处理它们。

1 事件发射器示例

//用on方法响应事件var net = require('net');var server = net.createServer(function(socket){    //当读取到新数据时处理的data事件    socket.on('data',function(data){        socket.write(data);    });});server.listen(8888);

这里写图片描述

2 响应只应该发送一次的事件

3 创建事件发射器:一个PUB/SUB的例子
可以用Node内置的事件模块创建自己的事件发射器。

var EventEmitter = require('events').EventEmitter;var channel = new EventEmitter();channel.on('join',function(){    console.log("Welcome!");});//用emit函数发射这个事件channel.emit('join');

3.2.3 异步开发的难题

原创粉丝点击