[TOC]
## 1. node.js是什么
* 不是一门语言,不是库,亦不是框架
* 是JavaScript语言的服务器运行环境
* Node内部采用Google公司的V8引擎,作为JavaScript语言解释器;通过自行开发的libuv库,调用操作系统资源
### 1.1 基本用法
#### 1.1.1 读取执行JavaScript脚本
例如: 当前目录的demo.js脚本文件
~~~
$ node demo
# 或者
$ node demo.js
~~~
#### 1.1.2 REPL环境
在命令行直接输入node后回车就会进入REPL环境(Read–eval–print loop,”读取-求值-输出”循环)
~~~
$ node
> 1+2
3
>
~~~
### 1.2 异步操作
Node约定,如果某个函数需要回调函数作为参数,则回调函数是最后一个参数。另外,回调函数本身的第一个参数,约定为上一步传入的错误对象。
~~~
var isTrue = function(value, callback) {
if (value === true) {
callback(null, "value is true")
} else {
callback(newError("value is not true")
}
}
var callback = function (error, res) {
if (error) {
return console.log(error)
}
console.log(res)
}
}
~~~
### 1.3全局对象和全局变量
>[warning] node提供的全局对象和全局变量,是所有模块都可以调用的,无需使用`require()`
* 全局对象
~~~
global: 表示Node所在的全局环境,类似于浏览器的window对象
process: 该对象表示Node所处的当前进程,允许开发者与该进程互动
console: 指向Node内置的console模块,提供命令行环境中的标准输入、标准输出功能
~~~
* 全局函数
~~~
setTimeout(): 用于在指定毫秒之后,运行回调函数
clearTimeout(): 用于终止一个setTimeout方法新建的定时器
setInterval(): 每隔一定毫秒调用回调函数
clearInterval(): 终止一个用setInterval方法新建的定时器
require(): 用于加载模块
Buffer(): 用于操作二进制数据
~~~
* 全局变量
~~~
__filename: 指向当前运行的脚本文件名
__dirname: 指向当前运行的脚本所在的目录
~~~
## 2. 模块系统
### 2.1 模块加载
`require`命令用于指定加载模块
加载当前目录下的脚本
~~~
var rule = require('./rule.js')
// 或者
var rule = require('./rule')
~~~
如果加载node的安装目录下的脚本
~~~
var bar = require('bar')
~~~
### 2.2 核心模块
node.js提供了一系列功能模块,用于与操作系统互动
[查看所有模块可参考Node.js v10.16.2 文档](http://nodejs.cn/api/assert.html)
~~~
http: 提供HTTP服务器功能
url: 处理与解析 URL
fs: 与文件系统交互
child_process: 衍生子进程
path: 处理文件路径和目录路径
os: 操作系统相关的实用方法
crypto: 加密功能,包括对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装。
// ...
~~~
### 2.3 自定义模块
~~~
// out.js
module.exports = {
print: function(value) {
console.log(value)
},
str: 'hi'
}
~~~
~~~
var m = require('./out.js')
m.print(m.str)
~~~
## 3. 异常处理
### 3.1 try catch捕获异常
但是该结构无法捕获异步运行的代码抛出的异常
~~~
try {
var m = 1
var n = m + z
} catch (err) {
// 在这里处理错误
}
~~~
### 3.2 回调函数
将错误对象作为第一个参数传入回调函数。
~~~
var fs = require('fs')
function errorFirstCallback(err, data) {
if (err) {
console.error('There was an error', err)
return
}
console.log(data)
}
fs.readFile('/some/file/that/does-not-exist', errorFirstCallback)
fs.readFile('/some/file/that/does-exist', errorFirstCallback)
~~~
### 3.3 EventEmitter接口的error事件
发生错误时,也可以用EventEmitter接口抛出error事件
~~~
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();
emitter.emit('error', new Error('something bad happened'));
// 需要对error事件部署监听函数,不然会导致整个应用程序崩溃
emitter.on('error', function(err) {
console.error('出错:' + err.message);
})
~~~