Node.js
Node.js
学习是为了更好地表达自己的思想,而这是机器代替不了的--尘风
初识Node.js
Node.js 概述
- Node.js 概念
Node.js
是运行在服务端的JavaScript
Node.js
是一个基于Chrome JavaScript
运行时建立的一个平台Node.js
是一个事件驱动I/O
服务端JavaScript环境,基于Google的V8引擎
- Node.js 前置
Node.js
前置知识是JavaScript
- Node.js 版本
- 在终端可用
node -v
或node --version
来查看当前Node
版本,不同版本可能有差异
- 在终端可用
- Node.js 模式
- 脚本模式(
node命令+js文件
,如:node 1.js)和交互模式(终端+node指令+输入语句
)
- 脚本模式(
Node.js 使用
- Node.js 安装
Node.js
官网上根据不同平台系统下载Node.js安装包
(.msi、.exe、.pkg、.zip)安装- Node.js官网
- Node.js历史版本下载地址
- Node.js安装包及源码下载地址
- Windows 32位安装包下载地址
- Windows 64位安装包下载地址
Linux
安装Node.js
须安装Python 2.6
或2.7
,不建议安装Python 3.0
以上版本
- Node.js 配置
Node.js
的配置是检测path系统环境变量
是否有Node.js
Node.js 工具
Node.js NPM
- Node.js NPM
npm
是同Node.js
一起安装的包管理工具,能解决Node.js代码部署
的问题npm
场景:下载第三方包、下载安装命令行程序、将包或命令行程序上传以供别人用
- NPM 常用命令
install npm -g
:更新npm版本npm --version或npm -v
:查看npm版本npm install <Module Name>
:安装npm包npm install -g cnpm --registry=镜像地址
:设置npm镜像
- NPM 包安装方式
npm
的包安装分为本地安装(local)、全局安装(global),命令行的差别在于是否有-g
- NPM 版本号解释
npm版本号
分为X.Y.Z
三位,分别代表主版本号、次版本号、补丁版本号npm代码
变更时版本号按以下原则更新:只修复bug
:更新Z位新增功能但向下兼容
:更新Y位有大变动且向下不兼容
:更新X位- npm官网地址
- NPM 设置推荐镜像
npm镜像
推荐设置淘宝npm镜像
,因国内直接用npm官方镜像
非常慢- 淘宝npm镜像是一个完整npmjs.org镜像
- 淘宝镜像地址
- 可用淘宝
定制的cnpm
(gzip压缩支持) 命令行工具代替默认的npm
- 命令:
npm install -g cnpm --registry=https://registry.npmmirror.com
Node.js REPL
- Node.js REPL
Node.js REPL
(Read Eval Print Loop) 交互式解释器,可在其输入命令并接收系统响应Node.js REPL
表示一个电脑的环境- 先输入
node命令
启动Node终端
,然后才能用REPL
- 与
REPL
类似的有Windows的终端
或Unix/Linux shell
Node
自带的交互式解释器可执行打印、执行、循环、读取操作,同时还可进行JS代码
调试- 打印:输出结果
- 执行:执行输入的数据结构
- 循环:循环操作以上步骤直到用户两次按下
Ctrl+C
退出 - 读取:读取用户输入,解析输入的
Javascript数据结构
并存储在内存中
REPL
常见命令如下:Ctrl+C
:退出终端tab
:列出当前命令.help
:列出使用命令按两次Ctrl+C或Ctrl+D
:退出REPL
深入Node.js
Node.js 应用
- Node.js 应用组成
Node.js应用
由require指令、创建服务器、接收请求与响应请求组成require指令
:用来加载和引入模块(内置模块、第三方模块、自定义模块)创建服务器
:创建服务器用来监听客户端的请求,类似的HTTP服务器有
:Apache、Nginx
接收请求与响应请求:
客户端用浏览器或终端发送请求,服务器接收请求后返回响应数据
- Node.js 创建应用
Node.js
创建应用指将Node.js
的应用组成进行代码实现(实现应用和HTTP服务器
)
Node.js 回调函数
- Node.js 回调函数简介
Node.js回调函数
体现了异步编程- 异步编程依托于回调来实现,但不是用了回调后程序就是异步化
Node.js回调函数
通过处理大量的并发请求,大大提高了Node.js的性能
Node.js回调函数
在完成任务后就被调用,Node
用了大量回调函数且所有API
都支持它回调函数
一般作为函数最后一个参数出现:function foo1(name,age,callback) {}
- Node.js 阻塞和非阻塞
- 阻塞是按顺序执行而非阻塞是不按顺序执行(
回调函数callback
)
- 阻塞是按顺序执行而非阻塞是不按顺序执行(
Node.js事件循环
- Node.js 事件循环
Node.js事件循环
指Node.js单线程
类似进入while(true)
,直到无事件观察者退出Node.js
是单进程单线程应用程序Node.js
因V8引擎
提供的异步执行回调接口,来处理大量并发带来极高性能
Node.js
基本上所有事件机制都是用设计模式中观察者模式实现- 每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数
- Node.js 事件驱动
Node.js
使用事件驱动模型,当web server
收到请求就关闭,然后去服务下个web请求
非阻塞式IO
或事件驱动IO
的特性使得Node.js
扩展性高- 在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数
非阻塞式IO
或事件驱动IO
指Web服务器
会一直接受请求而不等待任何读写操作
Node.js
有内置的事件,可通过引入events模块
并实例化EventEmitter类
来绑定和监听- 引入events模块:
var events = require('events');
- 实例化EventEmitter类:
var eventEmitter = new events.EventEmitter();
- 绑定事件:
eventEmitter.on('eventName', eventHandler);
- 触发事件:
eventEmitter.emit('eventName');
- 引入events模块:
Node.js EventEmitter
- Node.js EventEmitter类
EventEmitter
是Node.js
的一个类Node.js
所有异步I/O操作
在完成时都会发送一个事件到事件队列Node.js
所有产生事件的对象都是events.EventEmitter
的实例化对象Node.js
对象会分发事件,如:net.Server
新连接、fs.readStream
文件被打开
- Node.js events模块
events模块
只提供一个events.EventEmitter对象
,可通过require("events")
访问EventEmitter
是对事件触发与事件监听器功能的封装EventEmitter
提供多个函数,如:on
(绑定事件)、emit
(触发事件)EventEmitter
定义了一个特殊事件error
,包含了错误的语义,在遇到异常时触发error
触发时EventEmitter
若无响应的监听器,会把它当作异常退出程序并输出错误- 一般要为会触发
error事件
的对象设置监听器,避免遇到错误后整个程序崩溃
- 一般要为会触发
EventEmitter
触发的事件有:error事件
:实例化错误时触发newListener事件
:添加新监听器时触发removeListener事件
:监听器移除时触发
Node.js Buffer
- Node.js Buffer
Buffer类
用来创建一个专门存放二进制数据的缓存区,以让Node.js
处理二进制数据Buffer类
适用于TCP流
或文件流
等二进制的数据Buffer类
解决了JS
只有字符串数据类型无二进制数据类型的问题
Buffer类
是随Node内核
一起发布的核心库,其为Node.js
带来了一种存储原始数据的方法Buffer类
主要通过I/O操作
移动其中的数据Buffer实例
存储了原始数据,Buffer
类似整数数组,对应V8堆内存
外的原始内存
Buffer实例
用于表示编码字符序列,经显式字符编码可在Buffer实例
与JS字符串
间转换Node.js
目前支持的字符编码有:base64
:Base64编码ucs2
:utf16le的别名binary
:latin1的别名hex
:将每个字节编码为两个十六进制字符latin1
:一种把Buffer编码成字节编码的字符串的方式ascii
:仅支持7位ASCII数据,若设置去掉高位其编码非常快utf8
:多字节编码的Unicode字符,许多网页和其他文档格式都用utf16le
:占2或4B,小字节序编码的Unicode字符,支持代理U+10000~U+10FFFF
- 创建
Buffer类
的API
主要有:Buffer.allocUnsafe(size)
:返回一个指定大小的Buffer实例Buffer.alloc(size[, fill[, encoding]])
:返回一个指定大小的Buffer实例
Node.js Stream
- Node.js Stream
Stream
所有对象都是EventEmitter实例
Stream
是抽象接口且很多对象实现了它,如:request对象
、stdout
Stream
四种流类型:Readable
、Writable
、Duplex
、Transform
Stream
常用的事件:data
、end
、error
、finish
(已被写入到底层系统)Stream
的形式分为链式流、管道流- 链式流提供连接输出流到另外一个流并创建多个流操作链机制,用于管道操作
- 管道流提供输出流到输入流机制,用于从一个流中获取数据并将其传递到另外一个流中
Node.js 模块系统
- Node.js 模块系统的简介
Node.js模块系统
可让Node.js文件
相互调用- 模块是
Node.js应用程序
基本组成部分,且文件和模块是相互对应即Node.js文件
就是模块- 模块可是
JS代码
、JSON
、编译过的C/C++扩展
- 模块可是
Node.js
提供exports
、require
对象用于导入模块exports
是模块公开的接口,require
用于从外部获取模块的接口,即所获模块的exports对象
- Node.js 默认存在的模块
Node.js
默认存在4类模块:原生模块、3种文件模块http、fs、path
:原生模块mod
:非原生模块的文件模块./mod或../mod
:相对路径的文件模块/pathtomodule/mod
:绝对路径的文件模块
Node.js 函数
- Node.js 函数
Node.js函数
的使用与JavaScript
类似即一个函数可作为另一个函数的参数- 匿名函数指没有起名字的函数
- 可先定义一个函数然后传递,也可在传递参数的地方直接定义函数
Node.js 路由
- Node.js 路由
Node.js路由
通过提供的请求URL
、GET参数
、POST参数
来执行相应的代码- 路由需要的数据都包含在
request对象
,该对象作为onRequest()回调函数
第一个参数传递- 为解析这些数据需额外的
Node.JS模块
即url
模块、querystring模块
- 为解析这些数据需额外的
Node.js 全局对象
- Node.js 全局对象
Node.js全局对象
是global对象
,类似于JS
的Window对象
global
最根本的作用是作为全局变量的宿主- 所有全局变量(除global外)都是
global 对象的属性
Node.js
中可直接访问到global属性
,而不需要在应用中包含它- 全局对象(Global Object),它及其所有属性都可在程序的任何地方访问
- Node.js 全局变量
- 全局变量被定义时同时也会成为全局对象属性,反之亦然
Node.js
不可能在最外层定义变量,因所有代码都属于当前模块而它不是最外层上下文
- 按照
ECMAScript定义
,满足以下条件的变量是全局变量:- 全局对象的属性
- 在最外层定义的变量
- 隐式定义的变量(未定义直接赋值的变量)
- 最好不要用
var定义变量
以避免引入全局变量,因为它会污染命名空间,提高代码耦合风险 - 常见的全局变量有:
__dirname
:表示当前执行脚本所在的目录__filename
:表示当前正在执行的脚本的文件名,输出文件所在位置的绝对路径process
:表示当前Node.js进程状态的对象,提供了一个与操作系统的简单接口
- 全局变量被定义时同时也会成为全局对象属性,反之亦然
- Node.js 常用工具
Node.js常用工具
有util
,它是一个Node.js核心模块
,提供常用函数的集合util
用于弥补核心JS
的功能过于精简的不足
util
常见函数有:util.inherits(constructor, superConstructor)
: 实现对象间原型继承util.inspect(object,[showHidden],[depth],[colors])
:将对象转为字符串util.callbackify(original)
:将async异步函数
转换成遵循异常优先的回调风格- Node.js官方参考API
Node.js 文件系统
- Node.js 文件系统
Node.js文件系统
指fs
,它提供了一组类似UNIX(POSIX)标准
的文件操作API- Node导入文件系统模块(fs)语法:
var fs = require("fs")
- Node导入文件系统模块(fs)语法:
- Node.js 文件系统异步和同步
- Node.js文件系统(fs 模块)模块中的方法均有异步和同步版本
- 读取文件内容的函数有异步的
fs.readFile()
和同步的fs.readFileSync()
- 读取文件内容的函数有异步的
- 建议用异步方法,因为异步比同步方法性能更高、速度更快且无阻塞
- 异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)
- Node.js文件系统(fs 模块)模块中的方法均有异步和同步版本
Node.js GET/POST
- Node.js GET/POST
Node.js GET/POST
最常出现在服务器和用户浏览器交互中,如:表单提交GET请求
直接被嵌入在路径中即URL是完整的请求路径
,包括了?后面的部分
- 可用
url模块中的parse函数
手动解析后面的内容作为GET请求的参数
- 可用
POST请求
的内容全部都在请求体中,http.ServerRequest
并无一个属性内容为请求体- 等待请求体传输可能是一件耗时的工作
- 恶意的
POST请求
会大大消耗服务器资源 node.js
默认不解析请求体,若需要则手动来做
Node.js 高级
Node.js 工具模块
- Node.js 常用工具模块
- 常用模块:
OS
(系统)、Path
(路径)、Net
(网络)、DNS
(域名)、Domain
- 常用模块:
Node.js Web模块
- Web服务器
Web服务器
指网站服务器,是驻留在因特网上某种类型计算机的程序Web服务器
基本功能就是提供Web信息浏览服务
- 多数
web服务器
都支持服务端的脚本语言
(php、python、ruby)等web服务器
通过脚本语言从数据库获取数据,将结果返回给客户端浏览器
- Web主流服务器
- 目前最主流的三个Web服务器是
Apache
、Nginx
、IIS
- 目前最主流的三个Web服务器是
- Web应用架构
Web应用架构
分为Client
、Server
、Business
、Data
Data
:数据层,一般由数据库组成Client
:一般指浏览器,可通过HTTP协议向服务器请求数据Server
:一般指Web服务器,可接收客户端请求并向客户端发送响应数据Business
:业务层,通过Web服务器处理应用程序,如:数据库交互、调用外部程序等
- Node.js Web模块
Node.js Web模块
指http模块
,http模块
主要用于搭建HTTP服务端和客户端
Node.js Express框架
- Node.js Express框架简介
Express
是一个简洁而灵活的Node.js Web应用框架
, 提供了丰富的HTTP工具Express
可快速搭建一个完整功能的网站
- Node.js Express框架特性
Node.js Express框架核心特性
主要有以下:- 可设置中间件来响应HTTP请求
- 定义了路由表用于执行不同的HTTP请求动作
- 可通过向模板传递参数来动态渲染HTML页面
- Node.js Express框架安装
Node.js Express框架安装
须将其保存到依赖列表中- 安装命令:
cnpm install express --save
(前提是已设置好淘宝镜像)
- 安装命令:
Node.js Express安装
在当前目录的node_modules目录
,它会自动创建express目录
Node.js Express安装
后还要同时安装以下几个重要的模块:multer
:node.js中间件,用于处理设置表单的MIME编码的表单数据body-parser
:node.js中间件,用于处理JSON、Raw、Text、URL编码数据cookie-parser
:解析Cookie的工具,通过req.cookies可取到传来的cookie,并将其转成对象
- Express官网
- Express4.x API英文版
- Express4.x API中文版
Node.js RESTful
- REST
REST
是设计风格而不是标准REST
通常基于使用HTTP
、URI
、XML
、HTML
、JSON
REST
(Representational State Transfer)表述性状态传递,是一种软件架构风格REST
基本架构的Http方法:GET
获取、PUT
更新或添加、DELETE
删除、POST
添加
- RESTful
RESTful
指满足表述性状态传递的约束条件和原则的应用程序或设计RESTful
基于REST架构的Web Services
Web service
可开发分布式互操作的应用程序Web service
可用XML标准来描述、发布、发现、协调、配置应用程序Web service
是一个平台独立、低耦合、自包含、基于可编程的web应用程序
Node.js 多进程
- Node.js 多进程
Node.js 多进程
指通过事件驱动处理并发,在多核cpu上创建多个子进程(Node是单线程)Node.js 多进程
的每个子进程总有三个流对象:child.stdin、child.stdout、child.stderr- 三个流对象可能会共享父进程的stdio 流,也可是独立的被导流的流对象
Node.js
提供了child_process模块
来创建子进程,其方法有:child_process.spawn
:使用指定的命令行参数创建新进程child_process.exec
:使用子进程执行命令,缓存子进程的输出child_process.fork
:spawn()的特殊形式,用在子进程中运行的模块
Node.js JXcore
- Node.js JXcore简介
Node.js JXcore
是支持多线程的Node发行版本
,基本无需对现有代码改动就可多线程运行
- Node.js JXcore安装
Node.js JXcore安装过程
是先下载JXcore安装包,再解压,最后通过jx二进制文件命令操作
- Node.js JXcore文件
Node.js JXcore文件
打包生成后的文件有index.jxp
、index.jx
xxx.jx
:完整包信息的二进制文件,可运行在客户端上xxx.jxp
:中间件文件,包含了需要编译的完整项目信息
- Node.js JXcore资源
Node.js 数据库
- Node.js 连接MySQL
MySQL
是关系型数据库管理系统,由瑞典MySQL AB
开发,是Oracle
旗下产品- 要在
Node.js
中用MySQL
,须先安装MySQL
,命令为:cnpm install mysql
- Node.js 连接MongoDB
MongoDB
是一种文档导向数据库管理系统,由C++
撰写而成- 要在
Node.js
中用MongoDB
,须先安装MongoDB
,命令为:cnpm install mongodb
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!