书由浅入深,、系统地介绍了Node.js开发技术。书中提供了大量有针对性的实例,供读者实践学习,同时提供了大量的实践练习题及详尽的解答,帮助读者进一步巩固和提高。本书重在代码实践,阅读时应多注重实践编程。本书提供8小时配套教学视频及实例源代码下载,便于读者高效、直观地学习。
本书共分为11章。涵盖的主要内容有:Node.js的概念、应用场景、环境搭建和配置、异步编程;Node.js的模块概念及应用、Node.js的设计模式;HTTP简单服务的搭建、Node.js静态资源管理、文件处理、Cookie和Session实践、Crypto模块加密、Node.js与Nginx配合;UDP服务器的搭建、Node.js与PHP之间合作;Node.js的实现机制、Node.js的原生扩展与应用;Node.js的编码习惯;Node.js操作MySQL和MongoDB;基于Node.js的Myweb框架的基本设计架构及实现;利用Myweb框架实现一个简单的Web聊天室;在线聊天室案例和在线中国象棋案例的实现;Node.js的日志模块、curl模块、crontab模块、forever模块、xml模块和邮件发送模块等应用工具。
本书非常适合从事编程开发的学生、教师、广大科研人员和工程技术人员研读。建议阅读本书的读者对JavaScript的语法和PHP的相关知识有一定的了解。当然,如果你是初学者,本书也是一本难得的参考书。
腾讯Web前端工程师揭秘原生Node.js的开发实践,不借助任何第三方框架,通过编写原生代码,讲解Node.js应用开发
深入详解Node.js原生文档,根据原生API实践和大量应用实例,详细分析Node.js的开发过程,了解原生Node.js的API应用
涵盖Node.js基础知识、模块与NPM、Web应用、UDP服务、异步编程思想、异常处理过程、操作数据库的方法、框架开发与应用、开发工具等
注重实践,430多个代码小示例、30多个编程实践练习题及解答、5个大型系统,赠送8小时教学视频(需下载)
推荐阅读(请点丛书链接查看)
《网页制作与网站建设实战大全+JavaScript网页特效实例大全+DIV+CSS网页样式与布局实战详解(套装全3册)》
《Highcharts网页图表制作实例详解》
《HTML 5移动Web开发实战详解》
《Xamarin iOS移动开发实战》
《Swift入门很简单》
《iOS编程实战宝典》
《iOS开发范例实战宝典(基础篇)》
《iOS开发范例实战宝典(进阶篇)》
黄丹华,腾讯公司Web前端工程师。专注于PHP与Node.js的开发与应用。较早时间就开始关注Node.js的发展,并系统地学习和研究了国内外大量的Node.js学习资料。独创Mywebl.0的Node.js框架,目前正在开发Myweb2.0的Node.js框架。自营chinaNode.js微信公众账号,通过公众账号给国内外Node.js爱好者提供一个学习交流的平台。个人技术博客中提供的Node.js入门、资源分享和Nde.js异常分析等文章,被众多的Node.js爱好者所认可。
第1章Node.js基础知识
1.1概述
1.1.1Node.js是什么
1.1.2Node.js带来了什么
1.2Node.js配置开发
1.2.1Windows配置
1.2.2Linux配置
1.2.3HelloWorld
1.2.4常见问题
1.3异步编程
1.3.1同步调用和异步调用
1.3.2回调和异步调用
1.3.3获取异步函数的执行结果
1.4本章实践
1.5本章小结
第2章模块和NPM
2.1什么是模块
2.1.1模块的概念
2.1.2Node.js如何处理模块
2.1.3Node.js实现Web解析DNS
2.1.4Node.js重构DNS解析网站
2.1.5exports和module.eXports
2.2NPM简介
2.2.1NPM和配置
2.2.2Express框架
2.2.3jade模板
2.2.4forever模块
2.2.5socket.io模块
2.2.6request模块
2.2.7Formidable模块
2.2.8NPM模块开发指南
2.3Node.js设计模式
2.3.1模块与类
2.3.2Node.js中的继承
2.3.3单例模式
2.3.4适配器模式
2.3.5装饰模式
2.3.6工厂模式
2.4本章实践
2.5本章小结
第3章Node.js的Web应用
3.1HTTP服务器
3.1.1简单的HTTP服务器
3.1.2路由处理
3.1.3GET和POST
3.1.4GET方法实例
3.1.5POST方法实例
3.1.6HTTP和HTTPS模块介绍
3.2Node.js静态资源管理
3.2.1为什么需要静态资源管理
3.2.2Node.js实现简单静态资源管理
3.2.3静态资源库设计
3.2.4静态文件的缓存控制
3.3文件处理
3.3.1FileSystem模块介绍
3.3.2图片和文件上传
3.3.3jade模板实现图片上传展示功能
3.3.4上传图片存在的问题
3.3.5文件读写
3.4Cookie和Session
3.4.1Cookie和Session
3.4.2Session模块实现
3.4.3Session模块的应用
3.5Crypto模块加密
3.5.1Crypto介绍
3.5.2Web数据密码的安全
3.5.3简单加密模块设计
3.6Node.js+INginx
3.6.1Nginx概述
3.6.2Nginx的配置安装
3.6.3如何构建
3.7 文字直播实例
3.7.1 系统分析
3.7.2 重要模块介绍
3.8 扩展阅读
3.9 本章实践
3.10 本章小结
第4章 Node.js高级编程
4.1 构建UDP服务器
4.1.1 UDP 模块概述
4.1.2 UDP Server构建
4.2 UDP服务器应用
4.2.1 应用分析介绍
4.2.2 UDP Server端(图片处理服务器)实现
4.2.3 UDP Client端(Web Server)
4.2.4 Jade页面实现
4.2.5 应用体验
4.3 Node.js与PHP合作
4.3.1 UDP方式
4.3.2 脚本执行
4.3.3 HTTP方式
4.3.4 三种方式的比较
4.4 本章实践
4.5 本章小结
第5章 深入Node.js
5.1 Node.js的相关实现机制
5.2 Node.js原生扩展
5.2.1 Node.js扩展开发基础V8
5.2.2 Node.js插件开发介绍
5.3 Node.js异步扩展开发与应用
5.4 本章实践
5.5 本章小结
第6章 Node.js编码习惯
6.1 Node.js规范
6.1.1 变量和函数命名规范
6.1.2 模块编写规范
6.1.3 注释
6.2 Node.js异步编程规范
6.2.1 Node.js的异步实现
6.2.2 异步函数的调用
6.2.3 Node.js异步回调深度
6.2.4 解决异步编程带来的麻烦
6.3 异常逻辑的处理
6.3.1 require模块对象不存在异常
6.3.2 对象中不存在方法或者属性时的异常
6.3.3 异步执行的for循环异常
6.3.4 利用异常处理办法优化路由
6.3.5 异常情况汇总
6.4 本章实践
6.5 本章小结
第7章 Node.js与数据库
7.1 两种数据库介绍
7.1.1 MySQL介绍
7.1.2 MongoDB模块介绍
7.2 Node.js与MySQL
7.2.1 MySQL安装配置应用
7.2.2 MySQL数据库接口设计
7.2.3 数据库连接
7.2.4 数据库插入数据
7.2.5 查询一条数据记录
7.2.6 修改数据库记录
7.2.7 删除数据库记录
7.2.8 数据条件查询
7.3 Node.js与MongoDB
7.3.1 MongoDB的安装以及工具介绍
7.3.2 MongOD的启动运行方法
7.3.3 MongoDB的启动运行
7.3.4 MongoDB数据库接口设计
7.3.5 数据插入
7.3.6 数据修改
7.3.7 查询一条数据
7.3.8 删除数据
7.3.9 查询数据
7.4 MySQL与MongoDB性能
7.4.1 测试工具及测试逻辑
7.4.2 MySQL性能测试代码
7.4.3 MongoDB性能测试代码
7.4.4 性能测试数据分析
7.5 本章实践
7.6 本章小结
第8章 MyWeb框架介绍
8.1 MyWeb框架介绍
8.1.1 MyWeb框架涉及的应用
8.1.2 MyWeb框架应用模块
8.2 MyWeb源码架构
8.2.1 框架MVC设计图
8.2.2 框架文件结构
8.2.3 扩展阅读之更快地了解新项目
8.3 框架源码分析
8.3.1 框架入口文件模块
8.3.2 路由处理模块
8.3.3 Model层基类
8.3.4 Controller层基类
8.4 本章实践
8.5 本章小结
第9章 框架应用MyChat
9.1 编码前的准备
9.1.1 应用分析
9.1.2 应用模块
9.1.3 功能模块设计
9.2 系统的编码开发
9.2.1 Model层
9.2.2 Controller层
9.2.3 View层
9.3 项目总结
9.3.1 forever启动运行项目
9.3.2 系统应用体验
9.3.3 系统开发总结
9.4 扩展阅读之MyWeb 2.0的介绍
9.5 本章实践
9.6 本章小结
第10章 Node.js实例应用
10.1 实时聊天对话
10.1.1 系统设计
10.1.2 系统的模块设计
10.1.3 系统编码实现
10.2 联网中国象棋游戏
10.2.1 系统设计
10.2.2 系统的模块设计
10.2.3 系统编码实现
10.2.4 系统体验
10.3 本章小结
第11章 Node.js实用工具
11.1 日志模块工具
11.1.1 日志模块介绍
11.1.2 日志模块实现
11.1.3 日志模块应用
11.2 配置文件读取模块
11.2.1 配置文件解析模块介绍
11.2.2 配置文件解析模块实现
11.3 curl模块
11.3.1 curl模块介绍
11.3.2 curl模块实现
11.3.3 curl模块应用
11.4 crontab模块
11.4.1 crontab模块介绍
11.4.2 crontab模块设计实现
11.4.3 crontab模块应用
11.5 forever运行脚本
11.5.1 forever运行脚本介绍
11.5.2 forever运行脚本实现
11.5.3 forever运行脚本应用
11.6 xml模块的应用
11.6.1 xml解析模块介绍
11.6.2 xml模块设计实现
11.6.3 xml模块应用
11.7 邮件发送模块应用
11.7.1 邮件模块介绍
11.7.2 邮件模块设计实现
11.7.3 邮件模块应用
11.8 本章小结
第3 章 Node.js 的Web 应用
本章将介绍Node.js 的Web 应用,主要包括HTTP 服务器、Node.js 静态资源管理、
Node.js 的文件处理功能、Cookie 和Session 的应用、Node.js 安全加密,介绍Node.js
如何与Nginx 搭档。
本章将会结合"文字直播Web 应用"来贯穿本章的知识点。文字直播应用是一个长连
接多请求的应用,Node.js 在这方面具有非常大的优势,因此本章使用该例子来介绍本章知
识点。该应用使用Node.js 开发可以在很大程度上降低服务器压力,同时给予用户一个更
好的在线体验。文字直播Web 应用需求简单介绍如下。
用户:直播员(需登录),游客。
直播方式:直播员登录后台,输入相应的直播信息,可包含图片和文字。
技术统计:需在线实时记录运动员数据。
游客讨论:游客可实时进行在线讨论。
微博分享:游客可通过腾讯微博和新浪微博分享直播内容。
3.1 HTTP 服务器
本节将介绍如何应用Node.js 创建一个HTTP 服务器来处理客户端的POST 和GET 数
据请求,以及服务器端Node.js 如何实现url 路由请求处理。会介绍Node.js 模块中的
HTTP 和HTTPS。重点是介绍如何实现Node.js 的服务器路由。
3.1.1 简单的HTTP 服务器
创建一个HTTP 服务器的相关知识点在Node.js 的配置开发已经有所介绍。应用
Node.js HTTP 模块中的createServer() API。代码如下:
var http = require('http');
/ 应用Node.js 的原生模块HTTP 来实现Web 服务器创建 /
http.createServer(function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at 127.0.0.1:1337/');
http.createServer()接收一个request 事件函数,该事件函数有两个参数request 和
Node.js 开发实战详解
·78 ·
response,request 是 http.ServerReques1的实例对象,response 则为http.ServerRespons2实例
对象。request 对象主要是获取请求资源信息,包括请求的url、客户端参数、资源文件、
header 信息、HTTP 版本、设置客户端编码等。Response 对象主要是响应客户端请求数据,
包括HTTP 的header 处理、HTTP 请求返回码、响应请求数据等。
http.createServer()调用返回的是一个server 对象,server 对象拥有listen 和close 方法,
listen 方法可以指定监听的IP 和端口。
实例介绍:创建一个HTTP 服务器,获取并输出请求url、method 和headers,同时根
据请求资源做不同的输出。
当请求'/index',返回200,并且返回一个html 页面数据到客户端。
当请求'/img',返回200,并且返回一个图片数据。
若为其他情况,则返回404,并输出'can not find source'。
先创建HTTP 服务器,使用switch 判断请求资源类型分配。代码如下:
/ http.js /
var http = require('http'),
fs = require('fs'),
url = require('url');
/ 创建http 服务器 /
http.createServer(function(req, res) {
/ 获取Web 客户端请求路径 /
var pathname = url.parse(req.url).pathname;
/ 打印客户端请求req 对象中的url、method 和headers 属性 /
console.log(req.url);
console.log(req.method);
console.log(req.headers);
/ 根据pathname,路由调用不同处理逻辑 /
switch(pathname){
case '/index' : resIndex(res); // 响应HTML 页面到Web 客户端
break;
case '/img' : resImage(res); // 响应图片数据到Web 客户端
break;
default : resDefault(res); // 响应默认文字信息到Web 客户端
break;
}
}).listen(1337);
[代码说明]
var pathname = url.parse(req.url).pathname:获取客户端请求路径。
console.log(req.url):输出请求url。
console.log(req.method):输出请求方法。
console.log(req.headers):输出请求header 信息。
resIndex(res):判断请求参数是否为/index,如果是就执行resIndex(res)。
resImage(res):判断请求参数是否为/img,如果是就执行resImage(res)。
resDefault(res):返回404 not find。
1 参考网站nodejs.org/api/http.html#http_class_http_serverrequest。
2 参考网站nodejs.org/api/http.html#http_class_http_serverresponse。
第3 章 Node.js 的Web 应用
·79·
记住要把res 参数传递到处理返回函数,如果需要执行HTTP 响应请求时,也必须将
req 传递到处理函数。代码如下:
/
@desc 创建resIndex 响应首页html 函数
@parameters res HTTP 响应对象
/
function resIndex(res){
/ 获取当前index.html 的路径 /
var readPath = __dirname + '/' +url.parse('index.html').pathname;
var indexPage = fs.readFileSync(readPath);
res.writeHead(200, { 'Content-Type': 'text/html' });
res.end(indexPage);
}
/
@desc 创建resImage 响应image 函数
@parameters res HTTP 响应对象
/
function resImage(res){
/ 获取当前image 的路径 /
var readPath = __dirname + '/' +url.parse('logo.png').pathname;
var indexPage = fs.readFileSync(readPath);
res.writeHead(200, { 'Content-Type': 'image/png' });
res.end(indexPage);
}
/
@desc 创建resDefault 响应404 函数
@parameters res HTTP 响应对象
/
function resDefault(res){
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('can not find source');
}
[代码说明]
resIndex(res)处理并返回'Content-Type': 'text/html'的html 页面。
esImage(res)处理并返回'Content-Type': 'image/png'的png 图片。
resDefault(res)处理并返回404 输出'can not find source'。
执行http.js,打开浏览器,输入不同的请求资源,查看和比较不同的返回结果。
node http.js
(1)打开浏览器,输入127.0.0.1:13371,如图3-1 所示返回了404,并输出了'can not find
source'。
1 本文输入的192.168.1.120:1337 为个人的一个测试服务器,和本地服务器IP 地址127.0.0.1:1337
是一致的,读者输入的是127.0.0.1:1337。
Node.js 开发实战详解
·80 ·
图3-1 浏览127.0.0.1:1337 返回Web 页面图
(2)HTTP 新增请求路径/index,127.0.0.1:1337/index,如图3-2 所示返回200,并输出
index.html 页面内容。
图3-2 浏览127.0.0.1:1337/index 返回Web 页面图
(3)改变HTTP 路径为/img,127.0.0.1:1337/img,如图3-3 所示返回200,并输出了一
个png 的logo 图片。
图3-3 浏览127.0.0.1:1337/img 返回Web 页面图
如图3-4 所示为服务器端输出的结果,这里只截取了部分,输出的结果包含了每次请
求的url,method 和请求headers。可以看到每次HTTP 请求都会自带一个/favicon.ico 请求,
这个是网页的ico,是大多数浏览器自我发出的请求,如果需要去除这个请求,可以设置返
回一个有效的/favicon.ico 文件,并且指定expire 时间。
第3 章 Node.js 的Web 应用
·81·
图3-4 Node.js 服务器运行流水日志图
3.1.2 路由处理
了解Node.js 服务器创建功能实现后,接下来介绍根据不同客户端的请求资源路径,
来分配服务器处理逻辑。在3.1.1 节中已经初步了解到可以使用switch 来实现路由,当然
这是一种路由处理办法,但是在请求资源非常复杂时,使用switch 来判断处理就会显得很
庞大,而且难以维护和扩展。本节将介绍两种路由处理方法,大家可根据自己的想法设计
出更多的路由处理方法,另外在本章的习题1 中还会提供第三种路由处理方法。
1.特定规则请求路径
特定规则请求参数:可以根据用户请求的url,依据特定的规则得到相应的执行函数,
例如请求参数/index,根据特定规则转化为resIndex(res, req)方法。
这里将HTTP 的请求路径/index,根据一定的规则得到其处理函数resIndex,当我们需要
新增处理逻辑时,例如/img,则必须在服务器端新增处理函数resImg。具体实现过程如下:
var param = pathname.substr(2),
// 获取客户端请求的url 路径,并获取其及时个参数,将其小写转为大写
firstParam = pathname.substr(1,1).toUpperCase();
// 根据pathname 获取其需要执行的函数名
var functionName = 'res' + firstParam + param;
response = res;
if(pathname == '/'){
resDefault(res)
} else if (pathname == '/favicon.ico') {
return;
}
else{
eval(functionName + '()');
}
[代码说明]
firstParam = pathname.substr(1,1).toUpperCase():将参数的首字母改为大写,例如
/index,获取i,并将其改为大写的I;
Node.js 开发实战详解
·82 ·
functionName = 'res' + firstParam + param:获取需要执行的函数名,res 为前缀,
firstParam 为首字母,例如/index,firstParam 为I,param 为ndex,因此functionName
为resIndex;
pathname == '/':无参数时返回default 页面;
pathname == '/favicon.ico':对于该请求返回空信息;
eval(functionName + '()'):使用eval 执行字符串函数。
该方法有一个很明显的缺点,就是res 和req 参数必须设置为全局变量,否则函数中无
法获取该res 和req 对象参数。
这里只是介绍了一种实现方式,可以根据/param 参数来判断需要调用的模块和函数,
对于小项目而言可以实现这种路由处理。
2.利用附带参数来实现路由处理
利用自带参数来实现路由处理:url 路径指定需要执行的模块,通过在HTTP 的url 中
携带一个c 参数,表示需要调用的模块中的方法名,从而实现简单的路由处理。例如
/image?c=img 表示获取index 模块中img 方法,同样/index?c=index 表示获取index 模块中
的index 方法。具体实现是创建client.js 作为服务器模块,代码如下:
/ 首先require 加载两个模块 /
var http = require('http'),
url = require('url'),
querystring = require("querystring");
/
@desc 创建web 服务器
/
http.createServer(function(req, res) {
/ 获取用户请求的url 路径 /
var pathname = url.parse(req.url).pathname;
if (pathname == '/favicon.ico') { // 过滤浏览器默认请求/favicon.ico
return;
}
/ 根据用户请求的url 路径,截取其中的module 和controller /
var module = pathname.substr(1),
str = url.parse(req.url).query,
controller = querystring.parse(str).c,
classObj = '';
try { // 应用try catch 来require 一个模块,并捕获其异常
classObj = require('./' + module);
}
catch (err) { // 异常错误时,打印错误信息
console.log('chdir: ' + err);
}
if(classObj){ // require 成功时,则应用call 方法,实现类中的方法调用执行
classObj.init(res, req);
classObj[controller].call();
} else { // 调用不存在的模块时,则默认返回404 错误信息
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('can not find source');
}
}).listen(1337);
第3 章 Node.js 的Web 应用
·83·
[代码说明]
var pathname = url.parse(req.url).pathname:获取客户端的HTTP 请求路径,也就是
请求模块;
controller = querystring.parse(str).c:获取请求参数c,也就是请求模块的方法;
classObj = require('./' + module):使用try catch 获取一个require 模块;
本书从实践出发,一步步地引领读者深入学习Node.js的原生Web开发技术。书中的一些案例分析来自于作者的开发实践,有很强的实用性和指导意义。总之,本书对于Node.js爱好者来说是一本非常有价值的参考书,值得阅读。
——腾讯国际业务部社区平台开发总监刘志浩
本书高屋建瓴地阐述了Node.js的理论知识,又深入浅出地介绍了其技术细节,谈及的编程技巧可谓波谲云诡,而其应用实践更是变幻莫测。总之,笔触简练深沉,力透纸背,行文如流水,读来酣畅淋漓,全文一气呵成,浑然一体,实乃作者扛鼎大作,亦属业界佳品。
——腾讯公司后台开发工程师 王震
本书结合工作项目,带你领略一番JavaScript在服务器端的英姿,内容涵盖了Node.js的精髓,很多内容是作者在项目应用中的成果。可以说,本书是当前市场上最为详细而实用的一本Node.js开发图书。
——腾讯公司CDG前端开发工程师 郭湃钦
本书就像描述一段旷世奇恋,随着剧情的深入,每个人心中的记忆之门都在无意中被打开,而书中一个惊人的秘密也随之被揭开:原来Node.js技术在腾讯帅哥工程师的笔下居然是如此引人入胜,相见恨晚。
——腾讯公司博学测试工程师吴晓丹
脏
不错
太贵了,做这行没办法,读起来还行
应该是放久了,有些旧
很有实用学习价值
不错
买回来收藏的
纸质好。
挺好的,当当的东西还是值得信任.就是物流方面需要加强点.
不错,物流快。
嗯,不错很喜欢
很好
评论有积分赚哦
不错的一本书
例子挺多的,可以好好学习参考一下
包装太差劲,一个角都裂开了
非常好的一本书,推荐阅读!
书很好 发货超快 闪速
喜欢,整体感觉不错,包装也很好
性价比高,是正版书,推荐购买。
好书好书,帮朋友买的
很不错的书,断断续续看了部分,性价比高!
内容很好就是书中有错误不知道是印刷错误还是盗版,目前阅读到17页发现的一个错误
写的很详细
书的质量还可以,内容还没有开始看。就是刚收到货封皮就掉了,我也是真心醉了。
书的内容不错 例子也很实用 只不过 node. js发展太快 版本不同一些代码的写法也不同了 。需要自己结合网上查的资料来学习
网上盛传好,还没有看多少。但是作者的精神而言应该错不了的。书很大气,很好。
用来学习前端知识— —知乎看到推荐买的,就买来了!