| nodeJS
|
| buffer: 处理二进制, 对字符串与二进制进行转换 (done)
| fs: 文件系统操作 (done)
| http: 处理http请求, 创建服务器, 和处理客户端与服务器之间的数据传递request、response (done)
| stream: 文件流
| path: 文件路径的处理 (done)
| URL: 网络地址解析 (done)
| querystring: URL查询字符串 (done)
| Cookie、Session、Token (done)
| event: 事件机制
|
| DNS: 域名解析
| net: TCP网络
| dgram: UDP网络
| crypto: 数据加密
| process: 进程
| childe_process: 子进程
| cluster: 集群
| global: 全局
|
| Express
| Template 模板 jade、
| Mysql (done)
| MongoDB
| redis
| RESTful 架构
|
安装
优点:
前端的局限性,可以对文件、进程、数据库等进操作,是一门纯后端
处理高并发 程序异步执行不会阻塞
缺点: nodejs是单线程
1、nodeJS安装,mac或windows系统需要到官网下载安装包,自带npm包管理器
2、安装express框架:npm install -g express
$ express // 执行命令
3、更新node版本
node需要下载一个n模块,是用来专门管理nodejs的版本
$ sudo npm install -g n # 安装n模块
$ sudo n stable # 升级到稳定版,也可以指定版本号 n v0.10.26
sudo n 8.9.4 # 升级到指定版本
4、其它命令
npm -v # 显示版本,检查npm 是否正确安装。
npm install express # 安装express模块
npm install -g express # 全局安装express模块
npm list # 列出已安装模块
npm show express # 显示模块详情
npm update # 升级当前目录下的项目的所有模块
npm update express # 升级当前目录下的项目的指定模块
npm update -g express # 升级全局安装的express模块
npm uninstall express # 删除指定的模块
NPM与包
NodeJS以CommonJS的包规范来制订,由包结构和包描述文件两部分组件
1、包结构
npm 下载完包存储到 node_modules 目录中,包含:
1)package.json: 包描述
2)bin: 存放可执行的二进制文件
3)lib: 存储javascript代码目录
4)doc: 用于存放文档的目录
5)test: 存放单元测试用例代码
NodeJS
Node采用了Google的V8引擎,作为javascript语言的解释器,Node是基于事件驱动和异步I/O的服务器环境
1、JS与node的区别
1)JS中顶层对象是 window,nodeJS中的顶层对象是 global
2)JS中 var a = 10; window.a; 可以访问到,但在node中global.a是访问不到的,因为node有模块的概念
node中一个文件就是珍上模块,每个模块有自己的作用域
2、REPL环境
在命令行输入node, 可以直接运行node命令
模块系统 require、exports
1、模块分为
模块加载:require('2.js');
1)内置模块: var fs = require('fs'); // 加载Node的内置模块 fs文件系统
2)文件模块: 自己定义的业务模块
定义一个food.common.js
var food = reuqire('./js/food.common'); // 加载业务模块
3)加载第三方模块
require('./2'); // 先按照加载的模块文件进行查找,如果没有找到会在文件名加上.js
2、绝对和相对路径
var fs = require('fs'); // 绝对路径,是在Node通过内部的node_modules查找到的模块
var moduleA = reuqire('./lib/moduleA'); // 相对路径
2、npm 全局安装和局部安装
1)全局安装会安装到Node目录中,各项目都可以使用 npm install -g gulp
2)局部安装,将一个模块安装到node_modules中,只在当前和子目录中使用
3、模块化
module和exports两个全局变量
1)module:每个模块下都包括module对象
Module {
id: '.',
exports: {},
parent: null,
filename: '/Users/apple/siguang.liu/nodeProject/server.js',
loaded: false,
children: [],
paths: [
'/Users/apple/siguang.liu/nodeProject/node_modules',
'/Users/apple/siguang.liu/node_modules',
'/Users/apple/node_modules',
'/Users/node_modules',
'/node_modules'
]
}
2)exports外部接口,通过require就可以调用这个接口
其实exports就是module.exports的引用
exports.name = 'siguang';
exports.getPrivate = function(){
return 'haha';
}
事件 EventEmitter
var EventEmitter = require('events').EventEmitter,
a = new EventEmitter;
a.on('event', function(){
console.log('event called');
})
a.emit('event');
—————————- Node API 文档 —————————-
process 进程对象
1、pid:进程id,也就是进程名
2、kill(pid):杀掉进程
3、nextTick(callback): 会在第一次事件环中最末尾执行,setTimeout和setImmediate属于第二事件环
console.log('开始');
setImmediate(function(){
console.log('setImmediate')
});
setTimeout(function(){
console.log('setTimeout');
}, 0);
process.nextTick(function(){
console.log('nextTick');
})
console.log('结束');
output:
--------------- 第一次 ----------------
开始
结束
nextTick
--------------- 第二次 ----------------
setTimeout
setImmediate
TCP
传输控制协议TCP是一个面向连接的协议,保证两台计算机之间数据传输的可靠性和顺序
它可以将数据从一台计算机完整有序的传到另一台计算机,http模块就是继承了net(TCP)模块
var net = require('net'); // 引用TCP模块
telnet系统嵌套的客户端,端口23, 用来连接服务器
退出TCP连接 alt+[, 退出telnet quit命令
connect
基于HTTP服务器的工具, 提供新的组织代码的方式来与请求响应对象进行交互,称为中间件
引用模块 var connect = require('connect');
connect作用:
1、托管静态文件
2、处理错误及不存在的url
3、处理不同类型的请求
utils 工具
var utils = reuqire('utils');
Events 事件
EventEmitter 类
var EventEmitter = require('events');
var emitter = new EventEmitter();
1、addListener(event, listener): 创建事件,客户端通过事件来调用,而服务端通过代码来调用事件侦听
on(event, listener):
// addListener 事件
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();
emitter.addListener('some_events', function(foo, bar){
console.log(foo, bar);
})
emitter.emit('some_events', 'helloA', 'world'); // helloA world
emitter.emit('some_events', 'helloB', 'world'); // helloB world
// on 可以
emitter.on('message', function(mes, name, age){
console.log(mes +" name:"+ name +" age:"+ age);
})
emitter.emit('message', '消息1', 'siguang', '32'); // 消息1 name:siguang age:32
emitter.emit('message', '消息2', 'lulu', '30'); // 消息2 name:lulu age:30
2、once():只执行一次
emitter.once('onceEvent', function(age){
console.log(age);
})
emitter.emit('onceEvent', '1'); // 只执行此次事件
emitter.emit('onceEvent', '2');
emitter.emit('onceEvent', '3');
3、removeListener(): 删除listener
4、removeAllListeners(): 删除所有
5、setMaxListeners(num): 正常事件的个数为10个, 如果超出通过此方法来改变限制的个数
6、setMaxListeners(): 每个emitter实例的最大监听数
7、listeners(event): 返回指琮事件的数组
8、emit(事件名, 参数): 执行事件
9、listenerCount(emitter, event): 返回事件个数
cookie 和 Session
https://cnodejs.org/topic/55f8d70a20d84f3d377582a3
1、cookie和session的区别
cookie存放在客户端 session存放到服务器上
cookie不安全,客户端可以修改, session不会被修改
session会保存在一定时间内保存在服务器端, 当访问增多, 会影响性能
2、cookie
存储到客户端的信息
3、session
# npm install express-session --save // 安装
session原理
1)服务器端有一个对象专门存session的对象或库 如sessions={};
2)通过req.session.sign来检查是否为已登录状态
3)如果没有登录,第一次访问会生成一个sid,Date.now()+Math.random(); 将sid存储到sessions中
4)把这个sid发送到浏览器端, 通过请求头中会有一个set-cookie, 将session中存到cookie中
set-cookie:connect.sid=s%3AjDb0ns6Ekas3I7ll3tm9Bxg_wd4WjBJY.wL8VyIWdHQNFWt%2ByE%2BjAV30r4M7ZQdVIXgeKBOzx5iY; Path=/; Expires=Fri, 25 Nov 2016 03:27:38 GMT; HttpOnly
HttpOnly 不能读不能写
session(options): 选项内容
1)name: session名称,设置cookie中,默认为connect.sid
2)stroe: session存储方式,默认存在内存中,也可以存储到redis、mongodb
3)secret: 通过设置secret字符串,来计算hash值并放在cookie产生的signedCookie防篡改
4) cookie: 存放session id 的cookie
5) genid: 产生一个新的session_id时,所使用的函数,默认使用uid2这个npm包
6)rolling: 每个请求都重新设置一个cookie
7)resave: 即使session没有被修改也保存session值
8)saveUnintialized: 保存新创建但未修改的session
示例:
router.get('/', function (req, res) {
if (req.session.sign) { // 检查用户是否已经登录
console.log(req.session);//打印session的值
res.send('welecome <strong>' + req.session.name + '</strong>, 欢迎你再次登录');
}
else { // 否则展示index页面
req.session.sign = true;
req.session.name = 'haha';
res.end('欢迎登陆!');
}
});
webSocket
轮循: 隔多长时间ajax发一次请求, 不间隔的去发
长轮循: 隔多长时间ajax发一次请求,接到结果后在发出下一次请求
webScoket: 长连接,浏览器和服务器只需要一次握手,浏览器就和服务器形成一个快速通道,两者之间相互传送数据
1、节省资源: Header只有2 Bytes,1字节8位 1kb = 1024 bytes
2、推送消息: 不需要客户端发请求
1、安装
# npm install ws
2、socket.io库
Socket.IO是websocket库,包括客户端的js和服务器端的nodejs,目标是构建可以在不同浏览器和移动设备上使用实时应用.
# npm install socket.io
https://www.zhihu.com/question/20831000 // scoketIO最大连接数和并发数
错误处理
1、同步方法 try catch
2、异步 判断回调函数error对象
3、流里判断错误,监听error事件
rs.on('error', function(error){
console.log(error);
})
http协议
content-type 的一些参数值: http://blog.csdn.net/blueheart20/article/details/45174399
request请求头: 客户端请求服务器的请求头
1、host: 主机地址
2、connection: 客户端与服务器的连接选项
3、accept: 服务器处理内容的优先级, q是权重 0-1之间范围
4、user-agent: 用户代理,发送浏览器的硬件、系统等信息, 可以通过些选择来收集用户的pc端还是moblie端访问的多少
5、accept-encoding: 告诉服务器所支持的编码
6、accept-language: 告诉服务器所使用的语言, 用于判断中文站还是英文站
response响应: 服务器向客户端响应
1、statusCode: 状态码
2、resonPhrase: 状态码描述
3、headers: 响应头信息
1) content-Type: 内容类型
2) location: 重定向url
3) content-disposition: 下载文件名
4) content-length: 响应内容的字节数
5) set-cookie: 写入客户端cookie
6) content-encoding: 响应内容编码
7) cache-Control: 缓存
8) Expires: 指定缓存过期时间
9) Etag: 服务器响应内容没有变化重新下载数据
10) connection: 默认keep-alive 保持连接,断开使用close
参考资料
https://thinkjs.org/
https://chyingp.gitbooks.io/nodejs/content/%E8%BF%9B%E9%98%B6/%E5%9B%BE%E7%89%87%E5%9C%B0%E5%9D%80%E8%BD%AC%E6%88%90datauri.html ***
http://nodeapi.ucdok.com/api/ // API中文文档
https://github.com/wangxueliang/node-api/blob/master/doc/fs.md API中文部分
https://nodejs.xiangfa.org/documentation/ // API中文文档
https://cnodejs.org/getstart // node入门
http://nqdeng.github.io/7-days-nodejs/
http://cnodejs.org/topic/581b0c4ebb9452c9052e7acb
http://nqdeng.github.io/7-days-nodejs/ // 7天会Node
https://www.gitbook.com/@chyingp
http://cnodejs.org/topic/581b0c4ebb9452c9052e7acb
https://cnodejs.org/topic/56ef3edd532839c33a99d00e
https://github.com/leizongmin/node123 // 资料导航Express框架
http://www.expressjs.com.cn/starter/hello-world.html
https://github.com/expressjs?page=2 express下的插件
https://github.com/nodejs nodeJS插件
插件:
http://node.zhufengpeixun.cn/
https://github.com/node-modules?page=1
https://github.com/keepfool/node-lessons
1、cookie: https://github.com/expressjs/cookie-parser // cookie-parser
http://www.cnblogs.com/coolicer/p/4191548.html
2、express-session: session的处理
3、cookie、sesssion加密的包 cookie-signature: https://github.com/visionmedia/node-cookie-signature
https://segmentfault.com/q/1010000000392851
4、token: express-jwt https://www.npmjs.com/package/express-jwt
http://ninghao.net/blog/2834
5、socket.io: npm install socket.io https://github.com/socketio/socket.io
2、mysql: https://www.npmjs.com/package/mysql // 连接和处理mysql
3、ws安装socket/IO服务包: npm install ws
4、mime: https://github.com/broofa/node-mime // 响应css、js文件的请求
http://blog.csdn.net/zgljl2012/article/details/44700953
5、body-parser: https://github.com/expressjs/body-parser // json
https://segmentfault.com/a/1190000003061925
6、superagent: http://visionmedia.github.io/superagent/
http://www.codesec.net/view/183926.html
7、node-images: https://github.com/zhangyuanwei/node-images // 图片转换
8、node-xlsx: https://github.com/mgcrea/node-xlsx // 处理xlsx文件
9、multer: https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md // 处理文件上传
req.body存储表单内容
req.file存储上传控制的内容
multer({dest: './public/upfile'}); 设置图片文件存储的路径
upload.single('sendUpfile'); // 上传单个文件 file的name="sendUpfile"
11、multiparty 文件上传: https://github.com/expressjs/node-multiparty
10、formidable: https://cnodejs.org/topic/4f5c62932373009b5c0b027b // 文件上传
11、up工具用于重启服务器, 每次代码修改不需要重启服务器,通过up来完成
安装 sudo npm install up -g
运行 到项目目录 up -watch -port 8080 server.js
模板:
1、handlebars http://www.cnblogs.com/iyangyuan/archive/2013/12/12/3471227.html
http://www.ghostchina.com/introducing-the-handlebars-js-templating-engine/
hbs: http://www.cnblogs.com/chyingp/p/hbs-getting-started.html
1、Jade
2、ejs
3、Haml
4、CoffeeKup
MD5 JS https://github.com/blueimp/JavaScript-MD5
HTML5 new FormData() http://www.cnblogs.com/lhb25/p/html5-formdata-tutorials.html