一、简介
- Node.js 就是运行在服务端的 JavaScript。
- 基于Chrome JavaScript 运行时建立的一个平台
- Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
- Node.js 是单进程单线程
- Hello World
//引入模块
var http = require('http');
//创建服务
const server = http.createServer(
(request, response) => {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
//发送响应数据
response.end('Hello World\n');
}
);
//监听
server.listen(8000);
注:代码中使用了箭头函数
执行node app.js
(Node环境还是必须安装的),浏览器http://127.0.0.1:8000/
,返回结果则成功
注:npm 是Node的包管理工具,一般不需要单独安装,随nodejs,npm -v
查看版本,npm init -y
初始化一个应用并自动创建package文件
- REPL Node 自带交互式解释器
二、基本使用
2.1 回调函数
- 异步编程依托于回调来实现
- Node 所有 API 都支持回调函数
如读文件时fs.readFileSync(path, options)
阻塞方法,执行完毕才会执行下一句,但是使用fs.readFile(path, options, callback)
非阻塞方法时,读文件操作开始后,就继续执行后面的代码,当读文件操作结束后再调用回调函数。
2.2 事件循环
- 虽然Node.js 是单线程,但 V8 引擎提供异步执行回调接口,所以Nodejs采用事件驱动模型,处理大量的并发任务
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
// 绑定 connection 事件处理程序
eventEmitter.on('connection', ()=> {
console.log('连接成功。');
// 触发 data_received 事件
eventEmitter.emit('data_received');
});
// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', ()=>console.log('数据接收成功。'));
// 触发 connection 事件
eventEmitter.emit('connection');
console.log("程序执行完毕。");
事件例子执行结果
2.3 模块系统
- 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
-
exports 封装方法
hello.js
exports.world = ()=>console.log('Hello World !');
使用require 引入
var hello = require('./hello');
hello.world();
-
module.exports 封装对象
people.js
function People() {
var name;
var age;
this.setName = na=>name=na;
this.setAge = ag=>age=ag;
this.out = ()=>console.log('name:'+name+',age:'+age);
}
module.exports = People;
var People = require('./people');
people = new People();
people.setName('LiHua');
people.setAge(12);
people.out();
2.4 全局对象
- Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性
- __filename 表当前正在执行脚本的文件名
- __dirname 表当前执行脚本所在的目录
- setTimeout(cb, ms) 在指定时间后执行
- clearTimeout(t) 停止通过 setTimeout() 创建的定时器
- setInterval(cb, ms)间隔时间执行,可用clearTimeout(t)停止
- console 控制台标准输出
- process 描述当前进程状态
2.5 常用工具
- 由核心模块util提供
- util.inherits(constructor, superConstructor) 是一个实现对象间原型继承 的函数
- util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出
- util.isArray(object) 是否是数组
- util.isRegExp(object) 是否是正则表达式
- util.isDate(object) 是否是日期对象
- util.isError(object) 是否是错误对象
2.6 文件系统
- 虽然文件系统(fs 模块)模块中的有异步和同步两个版本,但建议使用异步
打开文件
fs.open(path, flags[, mode], callback)
- path - 文件的路径
- flags - 文件打开的行为
- mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)
-
callback - 回调函数,带有两个参数如:callback(err, fd)
flag参数取值
获取文件信息
fs.stat(path, callback)
写入文件
fs.writeFile(file, data[, options], callback)
- file - 文件名或文件描述符。
- data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(流) 对象。
- options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'
- callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
读取文件
fs.read(fd, buffer, offset, length, position, callback)
- fd - 通过 fs.open() 方法返回的文件描述符。
- buffer - 数据写入的缓冲区。
- offset - 缓冲区写入的写入偏移量。
- length - 要从文件中读取的字节数。
- position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
- callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。
关闭文件
fs.close(fd, callback)
- fd - 通过 fs.open() 方法返回的文件描述符
- callback - 回调函数,没有参数
其他操作
fs.ftruncate(fd, len, callback)
截取文件
fs.unlink(path, callback)
删除文件
fs.mkdir(path[, mode], callback)
创建目录
fs.readdir(path, callback)
读取目录
fs.rmdir(path, callback)
删除目录
2.7 工具模块
OS 模块 提供基本的系统操作函数
Path 模块 提供了处理和转换文件路径的工具
Net 模块 用于底层的网络通信。提供了服务端和客户端的的操作
DNS 模块 用于解析域名
Domain 模块 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的
三、Express 框架
使用框架可以快速方便的搭建应用
Express 官网
四、多进程
4.1 创建异步进程
console.log("进程 " + process.argv[2] + " 执行。" );
if (process.argv[2] == 1){
var err = new Error('test error');
throw err;
}
const {exec} = require('child_process');
for (var i=0; i<3; i++){
var newProcess = exec('node support.js '+i, (error, stdout, stderr)=>{
if (error) {
// console.log(error.stack);
// console.log('Error code: '+error.code);
// console.log('Signal received: '+error.signal);
}
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
});
newProcess.on('exit', function (code) {
console.log('子进程已退出,退出码 '+code);
});
}
进程演示结果
创建异步的函数
child_process.spawn()
child_process.fork()
child_process.exec()
-
child_process.execFile()
注1: execFile 在类Unix 操作系统效率更高,不需要衍生 shell,因此也不能在Windows上使用,但可以使用设置了 shell 选项的spawn或exec
注2: 四个函数都返回ChildProcess
实例
4.2 创建同步进程
创建同步的三个方法,会阻塞 Node.js 的事件循环,暂停任何额外代码的执行直到衍生的进程退出
4.3 ChildProcess 类
-
ChildProcess
类的实例是EventEmitter
,代表衍生的子进程
网友评论