第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 异步开发的难题
- 第3章 Node编程基础
- node网络编程基础
- 第1章-安装Node.js及相关要点-1.2.Node.js的基础和语法
- 《Python核心编程》第3章 Python基础 练习
- 《Python核心编程》(第二版) 第3章 Python基础
- python核心编程读书笔记--第3章 基础语句语法
- 第一天 node.js基础部分
- 第7章 C#图形图像编程基础
- 第18章 网络编程基础
- 第1章 C++编程基础
- 第7章 TCP网络编程基础
- 第2章Java编程基础
- node基础【02】异步编程01
- Node.js 异步编程基础理解
- 套接字编程基础--Unix网络编程第3章总结
- 第1.1章 Node应用
- 第1章 Node简介
- java编程基础第三天
- 一份源代码 直观了解链表的功能
- WPF 如何画出1像素的线
- ROS之游戏手柄控制乌龟和机器人
- NYOJ 20 吝啬的国度
- Druid离线采用hadoopindex加载数据
- 第3章 Node编程基础
- java中this关键字和static关键字的用法
- 超简易版HIBERNATE第一个程序实现
- LAMP架构学习(1) 安装与配置MYSQL
- 机器语言
- 检查网络状态(Android3.0以上)
- 树莓派上搭建Git服务器
- poj 1724
- Linux 用grep、xargs 、rm查找包含某字符串的文件并删除