ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[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); }) ~~~