NodeJs基础
Node 核心
Node核心:
NodeJs回调
回调函数:异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了。
Node 使用了大量的回调函数,Node所有API都支持回调函数。未使用回调函数可能会产生阻塞。
阻塞:
1 2 3 4
| var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString()); console.log("程序执行结束!");
|
非阻塞:
1 2 3 4 5 6 7 8
| var fs = require("fs");
fs.readFile('input.txt', function (err, data) { if (err) return console.error(err); console.log(data.toString()); });
console.log("程序执行结束!");
|
NodeJs事件
事件驱动程序。当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
模块化
NodeJs 提供了两个命令,require 和 exports
exports是模块中公开的接口,require用于从外部获取接口,其实可以通过如此获取到所需模块的一个对象。
模块的加载顺序
一)从文件模块缓存中加载:
尽管原生模块与文件模块的优先级不同,但是都会优先于从文件模块的缓存中加载已经存在的模块。
二)从原生模块加载:
原生模块的优先级仅次于文件模块缓存的优先级。
require 方法在解析文件名之后,优先检查模块是否在原生模块列表中。
以http模块为例,尽管在目录下存在一个 http/http.js/http.node/http.json 文件,
require(“http”) 都不会从这些文件中加载,而是从原生模块中加载。
原生模块也有一个缓存区,同样也是优先从缓存区加载。
如果缓存区没有被加载过,则调用原生模块的加载方式进行加载和执行。
三)从文件加载:
当文件模块缓存中不存在,而且不是原生模块的时候,
Node.js 会解析 require 方法传入的参数,并从文件系统中加载实际的文件,
require方法接受以下几种参数的传递:
- http、fs、path等,原生模块。
- ./mod或../mod,相对路径的文件模块。
- /pathtomodule/mod,绝对路径的文件模块。
- mod,非原生模块的文件模块。
NodeJs Buffer
JS本身只有字符串类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区。
NodeJs Stream
Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。
例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。
Node.js,Stream 有四种流类型:
- Readable - 可读操作。
- Writable - 可写操作。
- Duplex - 可读可写操作.
- Transform - 操作被写入数据,然后读出结果。
所有的 Stream 对象都是 EventEmitter 的实例。常用的事件有:
- data - 当有数据可读时触发。
- end - 没有更多的数据可读时触发。
- error - 在接收和写入过程中发生错误时触发。
- finish - 所有数据已被写入到底层系统时触发。
NodeJs OS模块:(基本的系统操作函数)
- os.tmpdir() 返回操作系统的默认临时文件夹。
- os.endianness() 返回 CPU 的字节序,可能的是 “BE” 或 “LE”。
- os.hostname() 返回操作系统的主机名。
- os.type() 返回操作系统名
- os.platform() 返回操作系统名
- os.arch() 返回操作系统 CPU 架构,可能的值有 “x64”、”arm” 和 “ia32”。
- os.release() 返回操作系统的发行版本。
- os.uptime() 返回操作系统运行的时间,以秒为单位。
- os.loadavg() 返回一个包含 1、5、15 分钟平均负载的数组。
- os.totalmem() 返回系统内存总量,单位为字节。
- os.freemem() 返回操作系统空闲内存量,单位是字节。
- os.cpus() 返回一个对象数组,包含所安装的每个 CPU/内核的信息:型号、速度(单位 MHz)、时间(一个包含 user、nice、sys、idle 和 irq 所使用 CPU/内核毫秒数的对象)。
- os.networkInterfaces() 获得网络接口列表。
NodeJs Path 模块:(提供了处理和转换文件路的工具)
- path.normalize(p) 规范化路径,注意’..’ 和 ‘.’。
- path.join([path1][, path2][, …]) 用于连接路径。该方法的主要用途在于,会正确使用当前系统的路径分隔符,Unix系统是”/“,Windows系统是”\”。
- path.resolve([from …], to) 将 to 参数解析为绝对路径。
- path.isAbsolute(path) 判断参数 path 是否是绝对路径。
- path.relative(from, to) 用于将相对路径转为绝对路径。
- path.dirname(p) 返回路径中代表文件夹的部分,同 Unix 的dirname 命令类似。
- path.basename(p[, ext]) 返回路径中的最后一部分。同 Unix 命令 bashname 类似。
- path.extname(p) 返回路径中文件的后缀名,即路径中最后一个’.’之后的部分。如果一个路径中并不包含’.’或该路径只包含一个’.’ 且这个’.’为路径的第一个字符,则此命令返回空字符串。
- path.parse(pathString) 返回路径字符串的对象。
- path.format(pathObject) 从对象中返回路径字符串,和 path.parse 相反。
其他
NodeJs Net 模块:(提供了用于底层的网络通信的小工具,包含了创建服务器/客户端的方法)
NodeJs DNS 模块:(用于解析域名)
NodeJs Express框架:
请求和响应:
app.get(‘/‘, function (req, res) {
// –
})
Express 应用使用回调函数的参数: request和response对象来处理请求和响应的数据。
Request 对象:
request对象表示 HTTP 请求,包含了请求查询字符串,参数,内容,HTTP 头部等属性。常见属性有:
Reponse 对象:
- (1)res.app:同req.app一样
- (2)res.append():追加指定HTTP头
- (3)res.set(): 在res.append()后将重置之前设置的头
- (4)res.cookie(name,value [,option]):设置Cookie
- opition: domain / expires / httpOnly / maxAge / path / secure / signed
- (5)res.clearCookie():清除Cookie
- (6)res.download():传送指定路径的文件
- (7)res.get():返回指定的HTTP头
- (8)res.json():传送JSON响应
- (9)res.jsonp():传送JSONP响应
- (10)res.location():只设置响应的Location HTTP头,不设置状态码或者close response
- (11)res.redirect():设置响应的Location HTTP头,并且设置状态码302
- (12)res.send():传送HTTP响应
- (13)res.sendFile(path [,options] [,fn]):
- 传送指定路径的文件 -会自动根据文件extension设定Content-Type
- (14)res.set():设置HTTP头,传入object可以一次设置多个头
- (15)res.status():设置HTTP状态码
- (16)res.type():设置Content-Type的MIME类型