了不起的Node.js读书笔记
原文摘自我的前端博客,欢迎大家来访问
第二章 Js概览
基于GoogleV8引擎
- Object.keys(o)
- 数组方法:遍历forEach、过滤filter、改变map
- 实现了String.prototype.trim()
- 含有JSON解析
第三章 阻塞与非阻塞IO
单线程注意点
- 小心处理内存中的变量,可能会影响两次访问的结果
- 不要编写阻塞式代码,可能会影响第二次访问的时间
事件轮训
- 先注册事件
- 不断询问这些事件是否已经分发dispatch
- 当事件分发了,相应的回调就会被触发
- 如果事件未触发,则继续执行其他代码
- 捕获未来才会执行到的函数所抛出的异常是不可能的
- 避免同步IO
第四章 Nodez中的Javascript
global对象
- 对应于浏览器window
process对象
- process.nextTick == serTimeout(fn,1)
模块
- require module exports
- NPM
- 绝对模块指Node内置模块以及在node_modules模块require(‘fs’)
- 相对模块指通过相对路径找的模块require(‘./module’)
- 暴漏数据exports.a(多个)、重写module.exports(一个)
##事件
- EventEmitter
- 事件监听 on,事件分发emit,事件移除removeListener
- 只执行一次once
- data事件 数据是部分到达,而不是一次性全到达返回给你
buffer
- 处理二进制数据
第五章CLI &FS API
Stream
- stdin 可读流 stdout/stderr可写流
- stdin.resume 等待用户输入
- console == process.stdout.write(str + ‘\n’)
fs
- readdirSync(__dirname) readFileSync同步
- readdir(‘.’, async) readFile 异步
- createReadSteam 读取可变大小 有data、end事件多用于图片、大型文件等
- watchFile监视文件是否改变
process
- process.argv 运行的参数
- process.cwd 获取当前工作目录
- process.env 环境变量
- process.exit退出
- 信号量
第六章TCP
TCP
- 面向连接,基于IP协议
- IP协议发包无序,TCP给发送的IP包含了标示符和数据流顺序信息
- 面向字节 对字符以及字符编码完全无知,很好的灵活性
- 可靠性 三次握手、窗口时间重发
- 流控制,对接收和发送的速度控制
- 拥堵控制 避免拥堵、数包报的延迟率和丢包率不会太高
Telnet
- 当不是telnet协议是自动降级为TCP
- 发送GET /HTTP/1.1模拟浏览器请求,两次回车
net
- Node.js核心TCP模块
- data close end事件
- conn.setEncoding(‘utf-8’) 或 Buffer.toString(‘utf-8’)
- 服务端createServer 客户端connect方法 connect事件
第七章HTTP
HTTP
- TCP上层协议
- Content-Type类型 文本、HTML、XML、JSON、PNG
- Transfer-Encoding: chunked 输出的内容长度不能确定,Node天生的异步机制, 这样相应可以逐形成
- 301 永久转移 302 临时转移 304资源未改变 403未授权 404资源未找到
- 表单Content-Type application/x-www-form-unencoded
http 模块
- request、response 参数
- 判断路由为method+url
- querystring模块 将字符串解析成对象
- request方法模拟一个请求,传回来的数据2进制,设置utf-8
- superagent 模拟客户端(模拟一个请求)模块
- up 重启服务器模块
第八章Connect
工具集&中间件
- 模块:connect
- 中间件调用server.user(...)
- 日志中间件console.log(‘%s %s ’, req.method, req.url)
- 模拟请求时间过长中间件,在res.end是清除定时器
- static中间件 处理静态文件connect.static(‘..’)
- query中间件 获取查询字符串connect.query
- logger 中间件connect.logger(‘dev’)
- body parser中间件connect.bodyParser()如果在POST使用了JSON格式,body parser自动转JSON对象,还可以处理用户上传文件req.body.file多文件表单name 使用name=”file[]”
- seesion中间件 会话connect.session 使用方法req.session.user
- redis session 会话持久化中间件
- methodOverride 中间件 让低版本浏览器支持PUT、DELETE、PATCH
- basicAuth中间件 用户身份验证
第九章EXPRESS
express
- WEB应用开发框架,基于Connect
- app.set(‘view engine’, ‘ejs’) 设置EJS模板引擎
- app.set(‘view’, __dirname + ‘/view’) 设置视图层路径
- app.set(‘view cache’, ‘true) 设置模板缓存
- 使用app.get()、app.put()、app.post()配置路由,可传参数如:id,获取req.params.id
- res.render(‘search’,obj) 渲染模板
- 其他设置大小写敏感、严格路由、jsonp回调
- 为res和req提供了快捷方法 render渲染、redirect重定向req.header检查头信息
- 中间件 app.user(function(req, res, next){})
- 代码组织 分层、分包、MVC,建议仿照Spring MVC
模板引擎
Express/Haml/Jade/CoffeeKup/JQuery Templates for node
#第十章WebSocket
Ajax
- 异步javascripy
- 缺陷;每次都建立HTTP请求,消耗网络资源,不适于实时服务 HTML5 WebSocket
- 基于ws协议
- node支持:websocket.io
- 客户端new WebSocket
缺陷
- 关闭不意味着断开,使用心跳检测机制判断
- 对JSON支持不够友好
- 客户端临时断开无法解决 使用定时器或者刷新页面?
- 兼容性
第十一章Socket.io
优势
- 跨浏览器,支持WebSocket则原生,不支持使用长连接方式,连接会持续打开 20-50s
- 即使浏览器支持的WebSocket被代理或者防火墙禁止了,Socket.io仍然会通过其 他技术来解决
- 如果客户端停止传输信息,并且一定时间没有正常的关闭,则认为连接已经断开
- 当连接丢失时,自动重连
- 对逻辑进行分层,有命名空间
- 支持emit分发和listen监听事件
第十二章MongoDB
MongoDB
- 面向文档,绝大多数情况是JSON
- 连接 new mongodb.Server(‘127.0.0.1’, 27017)
- API open insert find ensureIndex findOne
- $set 设置 $push 推入数组
Mongoose
- 类似于JAVA中ORM框架,简化数据库开发
- 连接mongoose.connect(‘mongodb://localhost/database’)
- Schema:一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力
- Model: 由Schema发布生成的模型,具有抽象属性和行为的数据库操作对
- Entity:由Model创建的实体,他的操作也会影响数据库
- index 索引 title : {type : String, index : true} unique : true 唯一
- new Schema({}).pre(‘save’, function(){})保存之前做一些处理
- 常用API find,findOne,remove,update,count
- new Schema({}).find({_id:‘xx’}).where(‘title’,‘xxx’).sort(‘content’, -1).limit(5).run(function(err, data){}) 类似JQ查询
- .select(‘_id’, ‘name’)选择查询指定字段
- .skip 跳过 mongoose.Schema.ObjectId 生成随机ID
- clazz : [Clazz] 嵌套的Sehema
- clazz: {type : ObjectId , ref: ‘Clazz’} 关联查询
- 添加静态PersonSchema.statics.findByName通过model调用
- 添加实例方法 PersonSchema.methods.findSimilarTypes Entity调用
第十三章MySQL
MySQL
- 主要使用query执行SQL
- 有占位符 ? 插入数据(和JAVA一样)
- 使用seqelize Node版ORM框架
第十四章Redis
Redis
- 应用场景:简单数据模型、数据集。适合存储在内存
- seesion持久化
第十五章 代码共享
书写兼容性代码
- 导出模块 ,前端后端都可使用
(function(module){
module.exports = function(a, b ){
return a+b;
}
If(‘undefined’ != typeof window) {
Window.add = module.exports;
}
})(‘undefined’ == typeof module ? {module : {exports : {}}}: module)
- 模拟实现ECMA:扩展原型或者实现工具函数
- EventEmitter。Assert、XMLHttpRequest、DOM、WebSocket、node-canvas都在 git上有实现
- bowserbuild 将node模块转为浏览器可识别的代码
第十六章测试
assert
- 常用API ok,be/equal/eql/a/macth...
Mocha
- 简化书写
- 测试异步代码
- 生成报告
了不起的Node.js读书笔记的更多相关文章
- [读书笔记]了不起的node.js+实践(一)
环境的变化带来了技术大跃进,机遇和挑战同时到来.基于我js也没有学,只好赶鸭子上架一起学了.(>﹏<) 1.先读读书 一开始就不知死活地看<深入浅出node.js>,弄得团团转 ...
- js读书笔记
js读书笔记 基本类型的基本函数总结 1. Boolean() 数据类型 转换为true的值 转换为false的值 Boolean true false String 任何非空字符串 "&q ...
- 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)
了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发) Guillermo Rauch 编 赵静 译 ISBN 978-7-121-21769-2 2 ...
- node.js系列笔记之node.js初识《一》
node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...
- 一点感悟:《Node.js学习笔记》star数突破1000+
写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...
- Node.js学习笔记(3):NPM简明教程
Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...
- 系列文章--Node.js学习笔记系列
Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...
- Node.js学习笔记(2):基本模块
Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...
- Node.js学习笔记(1):Node.js快速开始
Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...
随机推荐
- win10 1607 密匙
win10 1607 安装密钥 GVLK Core=YTMG3-N6DKC-DKB77-7M9GH-8HVX7 Professional=VK7JG-NPHTM-C97JM-9MPGT-3V66T E ...
- Android NDK学习之第一个实例---端口扫描
为什么要写一个端口扫描的程序,Java来写不是很方便吗?因为我也没有想到什么例子能够方便的来练习.于是想到以前找到的端口扫描的C代码,于是想用他们来练习.扫描服务端端口的方式有许多种,最简单的就是直接 ...
- C# winform窗体设计-查询单个值
查询单个值主要用于对成绩最低分,最高分,学生总数,学生性别等信息的统计 在查询单个值的时候用到了ExecuteScalar方法,连接以及语句方面,以及思路和对数据的增删改差不多 下面请看一段代码: s ...
- C# winform窗体设计-数据库连接
本篇文章内容主要是小编上课所学的总结 最近小编在学习C#中的数据库管理方面,主要学习到数据库的增删改查,查询学生平均分,最低分,最高分等操作 [本篇文章中小编主要讲解数据库的连接] 在C#中使用数据库 ...
- 第二次作业———“A+B Format”思路与总结
GitHub链接: https://github.com/zzy19961112/object-oriented "A+B Format" 题目 解题思路: 一开始粗略看这道题,熟 ...
- hdu 2036 - 改革春风吹满地(计算几何)
题意:求解多边形面积 解法: 先了解数学上"叉积"的含义与性质: 三角形ΔABC的面积为: 我们可以依次计算每个三角形的面积,ΔABC,ΔACE,ΔEF - - 所有三角形的面积之 ...
- iOS - 沙盒中,如何判断存在文件、目录
在iOS开发中,在沙盒中创建沙盒一些存储各个功能的文件目录或者文件. 使用: [NSFileManager defaultManager] 1.判断目录,用她可以. 2.判断文件,用她可以. 3.创建 ...
- BZOJ2599 [IOI2011]Race
传送门 点分治,黄学长的选根方法会T掉,换了这个人的选根方法就可以了. 当然,你也可以选择黄学长的奇淫优化 //BZOJ 2599 //by Cydiater //2016.9.23 #include ...
- uC/OS-II互斥信号(OS_mutex)块
/*************************************************************************************************** ...
- PS------“窗口” -> "扩展功能"使用方法
http://forum.xitek.com/thread-1330039-1-1-1.html