Node.js
Node.js
学习是为了更好地表达自己的思想,而这是机器代替不了的--尘风
初识Node.js
Node.js 概述
- Node.js 概念
Node.js是运行在服务端的JavaScriptNode.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
graph LR A[path检测步骤]-->B[开始]-->C[运行]-->D[cmd]-->E[path]
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对象、stdoutStream四种流类型:Readable、Writable、Duplex、TransformStream常用的事件: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、DataData:数据层,一般由数据库组成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、JSONREST(Representational State Transfer)表述性状态传递,是一种软件架构风格REST基本架构的Http方法:GET获取、PUT更新或添加、DELETE删除、POST添加
- RESTful
RESTful指满足表述性状态传递的约束条件和原则的应用程序或设计RESTful基于REST架构的Web ServicesWeb 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.jxxxx.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

浙公网安备 33010602011771号