Node+Ven
一、Nodejs介绍
不是脚本语言,也不是框架,是基于chrome(谷歌) V8 引擎的一个JavaScript运行平台
NodeJS使用了事件驱动和非阻塞式I/O模式
NodeJS使用了ECMAScript6标准,不能操作DOM和BOM
二、NPM介绍
NPM(Node Package Manager)Node包的管理工具
允许用户从NPM服务器下载第三方的JS库到本地
安装:NPM与Node进行了绑定,安装完Node自动就安装了NPM
三、前期准备
1.下载安装Node
2.配置Node的环境
3.可以通过NPM初始化项目
可以手动配置
D:\IDEA\代码\Node>npm init
也可以自动配置(采用默认参数)
D:\IDEA\代码\Node>npm init -y
4.模块安装
1.本地安装(在当前项目下安装JS库)
将js库安装到当前执行到安装命令的文件夹下
npm install jquery
npm install bootstrap@3.3.7
2.全局安装
npm install -g [@版本号]
3.生成环境安装
项目中用到的JS库,在打包上转后需要用到;使用本地安装
npm install --save
cnpm install vue --save
4.开发环境安装
npm install --save -dev
cnpm install eslint --save-dev
5、CNPM和NPM
使用国内的npm镜像(淘宝)每10分钟与主站同步
使用时要将cnpm进行配置
npm install -g cnpm -registry=http://registry.npm.taobao.org
配置好这些可以在cmd里面用命令执行JS文件:node (文件名):node firstNode.js
四、开发工具
Idea\webstrom\vscode
五、commonjs模块规范
1.为什么使用commonjs模块规范
JavaScript不能进行大型应用的开发,没有模块系统、资源库少、没有标准的接口等;commonjs提供弥补了javaScript没有标准的缺陷。
2.Commonjs模块规范
每一个文件就是一个模块,有自己的作用域。一个文件中可以定义变量、函数、类型。对外是不可见的。
2.1定义一个模块
创建独立的js文件,并且要对外发布一个接口
每个模块都有一个module变量,变量代表当前模块;通过模块的exports属性向外提供接口
2.2引用模块
在js文件中使用require()方法引用指定的模块
语法:
require(模块的路径)
模块路径:如果在同一个目录下使用’./'开头的相对路径
2.3模块标识
就是require()方法的参数
六、Node中的模块
1、系统(核心)模块
不用安装,可以直接使用
Buffer模块
固定长度(0-255)的,处理二进制数据的字符模块,整型数组,显示的数据
是十六进制
创建Buffer模块对象
-
Buffer.alloc(size[,fill,[,encoding]])
size:buffer 对象长度
fill:初始化内容(会使用填充内容将buffer所有的空间进行填充)
encoding:编码格式,默认utf-8
-
Buffer.allocUnsafe(size)
size:buffer 对象的长度
注:此方法创建的buffer对象没有初始化,但是buffer对象中的内
容是随机的;此方法创建的速度快
let buf=Buffer.allocUnsafe(10);
console.log(buf);
-
Buffer.from(array)
array:可以是整型数组,也可以是字符串,buffer的长度有array
决定
常用的方法
a)、Buffer.byteLength(string) -> 获取字符串的字节数
b)、Buffer.isBuffer(object) ->判断对象是否是Buffer对象
c)、Buffer.concat(list[,totallLength]) ->连接指定的Buffer对象
-
buf.write(string[,offset[,length[,encoding]]])
将字符串写入Buffer对象,返回写入的字节数,主要用于
给allocUnsafe方法创建的Buffer对象初始化
String:要写入的内容
Offset:开始写入的位置,默认从下标为0的位置开始
Length:写入的长度
-
buf.fill(value[,offset[,end[,encoding]]])
使用value填充buffer对象,返回的是buffer对象,会将整个Buffer
填满
-
buf.toJSON()
将buffer转换为JSON数据返回:json中只有两个键type和
data);type对应的值是Buffer;data对应的是Buffer对象中的数据数组
7. buf.equals(Buffer) 比较两个Buffer对象是否全等(长度和内容)
8. buf.indexOf/lastIndexOf(string) 在buffer中查找指定字符返回字符第一
次(最后一次)出现的下标;不存在返回-1
9. buf.slice(start[,end]) 截取buffer;start:开始的位置;end:结束的位置
(不包含):返回的是buffer对象
文件系统模块 ->fs
该模块中提供了读写文件的fs
使用时前提:要使用require()方法引入此模块
-
读文件
fs.readFile(path,callback)
- path:要读取的文件的路径
- callback:回调函数,有两个参数,第一个参数标识异常对象,第二个参数表示读取的数据
-
写文件
fs.writeFile(path,data[,encoding],callback)
- path:要写数据的文件的路径
- data:写入的数据
- encoding:编码格式,默认utf8
- callback:回调函数,只有一个表示异常对象的参数
注:如果文件不存在,创建文件;如果文件存在,则覆盖原文件
-
追加文件
fs.appendFile(path,data[,encoding],callbback)
- path:要追加数据的文件路径
- data:要追加的数据
- encoding:编码格式,默认utf8
- callback:回调函数,只有一个表示异常对象的参数
注:如果文件不存在,则创建文件写入数据 -
获取文件信息
fs.stat(path,callback) 主要用于判断文件是否存在
- path:文件的路径
- callback:回调函数,有两个参数,第一个表示异常对象,第二个文件的信息对象
注:使用文件信息对象的isFile()方法和isDirectory()方法判断是否是文件或文件夹,通过异常对象判断文件或文件夹是否存在。
-
重命名文件
fs.rename(oldPathName,newPathName,callback)
- oldPathName:原文件名
- newPathName:新文件名
- callback:回调函数,有一个表示异常对象的参数
-
删除文件
fs.unlink(path,callback)
- path:删除的文件路径
- callback::回调函数,有一个表示异常对象的参数
- 注:如果文件不存在则报错。 -
创建目录
fs.mkdir(path[,recursive],callbacck)
- path:新文件夹的路径
- recursive:默认 false
- callback:回调函数,有一个表示异常对象的参数
- 注:不加recursive属性只能创建一级目录
-
删除目录
fs.rmdir(path[,recursive],callback)- path:要删除的目录路径
- recursive:默认false,只能删除空目录;如果为true可以删除非空目录。
-
文件流
流在Node中处理流式数据的接口,stream模块用于构建流接口的对象,可以通过HighWaterMark设置每次传入数据的大小。
// //读取数据
// const fs=require('fs');
// //创建读取流
// let read = fs.createReadStream('abc.txt');
// //设置读取的编码格式
// read.setEncoding('utf8');
// //监听 -> on()方法绑定事件(添加监听)read.on('')表示监听谁
// //data ->事件(监听)的名称
// //chunk -> 读取的数据
// let data ='';//保存读取的数据
// read.on('data',function(chunk){
// data+=chunk;
// console.log(chunk);
// })
// read.on('end',function(){
// console.log(data);
// })
// read.on('error',err=>{
// console.log('读取文件错误');
// })
// //输出流
// const fs=require('fs');
// //创建输出流
// let write=fs.createWriteStream('bbb.txt');
// //输出数据
// write.write('正在写的是输出流','utf8');
// //结束输出
// write.end();
// //监听事件
// write.on('finish',()=>{
// console.log('写入完成');
// })
// write.on('error',err=>{
// console.log(err);
// })
//管道流
const fs=require('fs');
//创建输入流
let read=fs.createReadStream('abc.txt');
//创建输出流
let write=fs.createWriteStream('abcd.txt');
//把输入流和输出流绑定
read.pipe(write);
console.log('复制完成');
http模块(https模块)
此模块主要用于搭建服务端和客户端
要搭建服务端和客户端就必须用到此模块
创建服务器
扒取网页
path模块
此模块主要用于文件和目录的路径
path.basename(filePath);获取路径中最后一级目录
path.dirname(filePath);获取路径中的目录
path.extname(filePath);获取路径中的后缀
path.parse(path);获取路径对象
格式化路径:
path.join([…paths]) 拼接给定的路径片段
__filename 获取当前文件的绝对路径
__dirname 获取当前目录的绝对路径
事件触发器(events)
Node是基于事件驱动的,通过events可以方便的创建事件,通过事件的回调函数定义监听函数。
能触发事件的对象都是EventeMitter实现类。当自定义一个类时必须继承EventeMitter。
1.创建触发器
on(eventName,function)
- eventName ->触发器名称
- function ->回调函数(事件操作)
2. 触发事件
emit(eventName[…params])
- eventName ->事件的名称
- params ->事件的参数
3. 只触发一次事件
once(eventName,function)
- eventName ->事件的名称‘
- function ->回调函数
4. 删除指定的事件
removeListener(eventName,function)
- eventName ->事件的名称‘
- function ->回调函数
5. 删除所有的事件
removeAllListeners([eventName])
- eventName ->事件的名称,如果没有参数表示移除所有
6. 设置同名事件的最大数
Emitter.setMaxListeners(n)
- n:事件的个数,默认为10个,超过了设定的个数会给出提示信息有可能内存溢出;n=0:表示不限制事件的数量
路由
就是URL与请求处理方法的映射
在Node中使用路由处理get/post请求,从URL中提取相应的信息(特别是提交的参数信息),需要去解析URL
http://localhost:3000/page/index.jsp?name=admin&pwd=123
要解析url通过URL模块中的pars()方法
url.parse(reqUrl,parseString);
url ->要解析的url地址
parseString ->是否将query项解析为字符,默false;当为true时将query解析为JSON数据(键值对)
处理get请求 ->获取请求中的参数
将提交的url进行解析,获取解析后url对象中的query项
处理post请求 ->获取请求中的参数
post请求提交的数据是按照流的形式提交的
pist请求如果使用url.parse()方法解析不能获取提交的参数(query是没有内容的)
借助querystring模块进行获取提交的参数
querystring.parse(str[,separator[,eq[,options]]])将字符串解析为query对象
str ->要解析的字符串
separator ->键值对的分隔符,默认&
eq ->键和值的分隔符,默认 = z
options ->参数设置
maxKeys ->最大的键值对数,默认值1000,如果设为0,表示忽略限制。
getPost请求通用
项目改动自动重启工具(nodemon)
安装 npm install nodemon -g
启动服务的命令:nodemon
Node 连接数据库
使用mysql模块,此模块提供了连接数据库的方法和连接池
前提:按照mysql模块
安装命令:npm install mysql --save
-
创建连接:
createConntion
host:‘localhost’,
port:3306,//端口号
user:root,//账号
password:123,//密码
database:‘smbms’//数据库
charset:utf-8 //字符编码 -
获取连接:
conn.connect(callback) -
关闭连接
conn.end(callback) //会关闭一个连接,在执行时会调用回调函数
conn.destroy()//销毁一个连接,没有回调函数
-
数据库的操作(增删改查)
conn.query(sqlStr[,params],callback)
sqlStr:要执行的sql语句,可以使用占位符
params:参数列表,数组
callback:回调函数,第一个参数:异常对象;第二个参数:结果对象
连接数据库之后操作数据:
-
查询:结果对象是查询的对象数组,每个对象就是一条记录
插入:结果对象包含两个属性:affectedRows ->受影响的行数;insertId ->插入数据的id列值 -
修改和删除:结果对象只包含一个属性:affectedRows ->受影响的行数
连接池:
管理数据库连接。