[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);
})
~~~