node js 知识点
1. 何为node.js?
1.1 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
1.2 其特点:
1.2.1 异步编程
1.2.2 单进程 单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。
1.2.3 每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。
1.2.4 基本上所有的事件机制都是用设计模式中观察者模式实现。
1.2.5 线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.
1.2.6 异步 I/O 操作在 完成时 都会发送一个 事件 到 事件队列。
1.2.7 许多对象都会 分发 事件:所有这些产生事件的对象都是 events.EventEmitter 的实例。
一个net.Server对象会在每次有新连接时 分发 一个事件,
一个fs.readStream对象会在文件被打开的时候 发出一个事件。
1.3 核心模块:
全局对象
常用工具
事件机制
文件系统访问
http服务器与客户端
1.4 不是js应用,而是js运行平台.是js的运行环境
2. 为何学习node.js?
1 能学习npm命令;
2 会REPL(交互式解释器)命令
3 其他构建工具是基于node.js的
4. 了解其require机制 和npm基于包规范的应用
5. nodejs实现了 commonJs规范
6. 学习其对模块的定义和调用
7. 前端包管理平台 bower
4. 创建node.js应用 需要什么?
4.1 引入 required 模块—-我们可以使用 require 指令来载入 Node.js 模块。 例如 var gulp =require(‘gulp’), events = require(‘events’);
4.2 创建服务器————服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
4.3 接收请求与响应请求—–服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。
3. node.js 提供了哪些模块?
3.1 http模块——-主要用于搭建 HTTP 服务端和客户端,使用 HTTP 服务器或客户端功能必须调用 http 模块
3.2 文件系统模块fs
3.3 url模块 和querystring模块
3.4 events模块—只提供了一个对象:events.EventEmitter;EventEmitter的核心就是 事件触发 与 事件监听器 功能的 封装。
3.5 工具模块util:
3.5.1 os模块—-提供基本的系统操作函数。
3.5.2 path模块—-提供了处理和转换文件路的工具。
3.5.3 net模块—-用于底层的网络通信。提供了服务端和客户端的的操作。
3.5.4 DNS模块—-用于解析域名。
3.5.5 domain模块—-简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的。
存在4类模块(原生模块和3种文件模块)
5.events模块,细说 EventEmitter;
1 EventEmitter 的核心就是事件触发与事件监听器功能的封装。
2 EventEmitter 对象
如果在实例化时发生错误,会触发 ‘error’ 事件。
当添加新的监听器时,’newListener’ 事件会触发,
当监听器被移除时,’removeListener’ 事件被触发。
3 EventEmitter 的每个事件由 一个事件名 和 若干个参数 组成,
事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个 事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用
事件参数 作为回调函数参数传递。
4 其 方法
4.1 addListener(event, listener)—-为指定事件 添加 一个监听器到监听器数组的 尾部。
4.2 on(event, listener)—-为指定事件 注册 一个监听器,接受一个字符串 event 和一个回调函数。
4.3 once(event, listener)—-为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
4.4 removeListener(event, listener)—-移除指定事件的某个监听器,监听器 必须是该事件已经注册过的监听器。
4.5 removeAllListeners([event])—–移除指定事件的某个监听器,监听器 必须是该事件已经注册过的监听器。
4.6 setMaxListeners(n)—–默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量
4.7 listeners(event)—–返回指定事件的监听器数组
4.8 emit(event, [arg1], [arg2], […])—-按参数的顺序 执行 监听器 ,如果事件有注册监听返回 true,否则返回 false。
5 其类方法
listenerCount(emitter, event)—-返回指定事件的监听器数量。
6 其事件
newListener—–该事件在添加新监听器时被触发。
removeListener—–从指定监听器数组中删除一个监听器。需要注意的是,此操作将会改变处于被删监听器之后的那些监听器的索引。
error 事件—-遇到 异常的时候通常会触发 error 事件。
6. 常用工具模块 util
util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足。
1 util.inherits—-对象间 原型继承
util.inherits(constructor, superConstructor)是一个实现对象间原型继承 的函数。
2 util.inspect—-转化为字符串
util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出。它至少接受一个参数 object,即要转换的对象。
3 util.isArray(object)—是数组否?
如果给定的参数 “object” 是一个数组返回true,否则返回false。
4 util.isRegExp(object)—是正则表达式否?
如果给定的参数 “object” 是一个正则表达式返回true,否则返回false。
5 util.isDate(object)—是日期否?
如果给定的参数 “object” 是一个日期返回true,否则返回false。
6 util.isError(object)—是错误对象否?
7. 文件系统模块fs
1. 读取文件
1.1 同步—-fs.readFile() :函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。
1.2 异步—-fs.readFileSync()–不推荐
2. 打开文件----fs.open(path, flags[, mode], callback) ;callback,带有两个参数如:callback(err, fd)。
例:fs.open('input.txt', 'r+', function(err, fd) {
if (err) {
return console.error(err);
}
console.log("文件打开成功!");
});
2.1 fd - 通过 fs.open() 方法返回的文件描述符。
3. 获取文件---fs.stat(path, callback); callback ,带有两个参数如:(err, stats), stats 是 fs.Stats 对象。
例:fs.stat('/Users/liuht/code/itbilu/demo/fs.js', function (err, stats) {
console.log(stats.isFile()); //true
})
3.1 stats类中的方法有:
stats.isFile() 如果是文件返回 true,否则返回 false。
stats.isDirectory() 如果是目录返回 true,否则返回 false。
stats.isBlockDevice() 如果是块设备返回 true,否则返回 false。
stats.isCharacterDevice() 如果是字符设备返回 true,否则返回 false。
stats.isSymbolicLink() 如果是软链接返回 true,否则返回 false。
stats.isFIFO() 如果是FIFO,返回true,否则返回 false。FIFO是UNIX中的一种特殊类型的命令管道。
stats.isSocket() 如果是 Socket 返回 true,否则返回 false.
4. 写入文件 ------fs.writeFile(filename, data[, options], callback);
如果文件存在,该方法写入的内容会覆盖旧的文件内容。
5. 异步读取文件 ----fs.read(fd, buffer, offset, length, position, callback)
6. 关闭文件----fs.close(fd, callback)
7. 截取文件---fs.ftruncate(fd, len, callback)
8. 删除文件---fs.unlink(path, callback)
9. 创建目录 --fs.mkdir(path[, mode], callback)
10. 读取目录----fs.readdir(path, callback)
11. 删除目录----fs.rmdir(path, callback)
<span class="sub-title">6. Web 模块</span>
创建web服务器:
var http = require('http');
http.createServer( function (request, response){ }).listen(8022);
<span class="sub-title">7 node.js的模块系统?</span>
1.创建模块,一个文件就是一个模块,即创建一个js文件;(node.js自带模块不用创建)
2. 运用exports 和 require 两个对象;
exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
//hello.js
function hello(){};
module.exports = hello;
//main.js
var hello = require('./hello.js');
<span class="sub-title">7. node.js的路由router</span>
1. 概念理解: 需要查看 HTTP请求 ,为 路由 提供请求的 URL 和其他需要的 GET及POST参数 ,随后路由需要 根据 这些 数据 来 执行 相应的代码。但这些数据在 request对象 中,该对象作为onRequest()回调函数的第一个参数传递。为了解析这些数据,我们需要额外的Node.JS模块,它们分别是url和querystring模块。
2. 路由决定了由谁(指定脚本)去响应客户端请求。
3.在HTTP请求中,我们可以通过路由提取出请求的URL以及GET/POST参数。
<span class="sub-title">8. request response对象</span>
1. 这2个对象分别作为作为onRequest()回调函数的参数传递
2. Request 对象 - request 对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:
req.app:当callback为外部文件时,用req.app访问express的实例
req.baseUrl:获取路由当前安装的URL路径
req.body / req.cookies:获得「请求主体」/ Cookies
req.fresh / req.stale:判断请求是否还「新鲜」
req.hostname / req.ip:获取主机名和IP地址
req.originalUrl:获取原始请求URL
req.params:获取路由的parameters
req.path:获取请求路径
req.protocol:获取协议类型
req.query:获取URL的查询参数串
req.route:获取当前匹配的路由
req.subdomains:获取子域名
req.accpets():检查请求的Accept头的请求类型
req.acceptsCharsets / req.acceptsEncodings / req.acceptsLanguages
req.get():获取指定的HTTP请求头
req.is():判断请求头Content-Type的MIME类型
3. Response 对象 - response 对象表示 HTTP 响应,即在接收到请求时向客户端发送的 HTTP 响应数据。常见属性有:
res.app:同req.app一样
res.append():追加指定HTTP头
res.set()在res.append()后将重置之前设置的头
res.cookie(name,value [,option]):设置Cookie
opition: domain / expires / httpOnly / maxAge / path / secure / signed
res.clearCookie():清除Cookie
res.download():传送指定路径的文件
res.get():返回指定的HTTP头
res.json():传送JSON响应
res.jsonp():传送JSONP响应
res.location():只设置响应的Location HTTP头,不设置状态码或者close response
res.redirect():设置响应的Location HTTP头,并且设置状态码302
res.send():传送HTTP响应
res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
res.set():设置HTTP头,传入object可以一次设置多个头
res.status():设置HTTP状态码
res.type():设置Content-Type的MIME类型
<span class="sub-title">Express框架</span> <strong>demo-express</strong>
1. Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。
使用 Express 可以快速地搭建一个完整功能的网站。
2. 安装 Express—会安装在当前目录的 node_modules 目录中
3. 同时安装
body-parser —-node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
cookie-parser —–这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
multer - node.js 中间件,—-用于处理 enctype=”multipart/form-data”(设置表单的MIME编码)的表单数据。
4. 请求和响应—参见equest response对象
5. 路由指定由谁(指定脚本)去响应客户端请求
6. Express 提供了内置的中间件 express.static 来设置静态文件如:图片, CSS, JavaScript 等。
7. cookie管理 —-可以使用中间件向 Node.js 服务器发送 cookie 信息
// express_cookie.js 文件
var express = require(‘express’)
var cookieParser = require(‘cookie-parser’)
var app = express()
app.use(cookieParser())
app.get('/', function(req, res) {
console.log("Cookies: ", req.cookies)
})
app.listen(8081)
<span class="sub-title">RESTful api</span>
1. 概念 REST(表述性状态转移)是一组架构 约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。即,REST是设计风格而不是标准。
2. REST 基本架构的四个方法:
GET - 用于获取数据。
PUT - 用于添加数据。
DELETE - 用于删除数据。
POST - 用于更新或添加数据。
<span class="sub-title">包</span>
用文件夹封装为一个模块,即为包
<span class="sub-title">nodejs与MVC架构</span>
1. V---node.js中的模板引擎
2. C----express中的路由控制法
</pre>