目录
简介
简称node,封装了谷歌的V8引擎,使javascript可以在服务器端运行
特点
(1)非阻塞I/O:又称为异步I/O,当线程遇到I/O操作时,不会以阻塞方式等待I/O操作完成或数据返回,而是将I/O请求转发给操作系统,继续执行下一条指令。
(2)事件驱动:以事件为中心,把每个任务都当做事件处理。
(3)node的执行是单线程的,一个线程只能处理一项任务,要想提高吞吐量必须使用多线程。
单线程:主线程维护一个事件队列,收到请求后将请求放进事件队列,然后接收下一个请求
node本身是多线程,在JavaScript层面是单线程
不适用于node.js的场合
数据加密和解密
数据压缩和解压
模板渲染
适用于node.js的场合
前后端分离REST API
单页WEB应用
微服务架构
统一WEB应用的UI层
//导入http模块
const http =require('http')
//创建服务器
const httpServer=http.creatServer(function(req.res))
//req:表示请求对象,res:响应对象:服务器端通过该对象客户端发送响应信息
res.writeHead(200,{'Content-Type':'text/plain'})
res.end('Hello world!')//服务端向客户端发送信息
});
//服务器自动监听
httpServer.listen(8089,function(){
console.log('服务器端运行在8089窗口上')
})
nodemon插件:可以监视node程序的改动,自动重启node程序
基本语法
箭头函数(ES6)
使用=>来定义函数
只有一条函数体语句,自带返回return功能,不能带有大括号,带有大括号时需要自己添加return语句
(1)一个参数的箭头函数:
var 变量名 = x =>x
对应的普通函数
var 变量名 =functin(x){
return x;
}
var f=x=>x var k=f(45) console.log(k)
(2)带有两个参数
var 变量名 =(x,y)=>x*y
对应的普通函数
var 变量名(x,y)=function(x,y){
return x*y;
}
(3)无参的箭头函数
var 变量名=()=>3*6
var 变量名 =function(){
return 3*6;
}
(4)函数体带有多条语句
var diffAge=(x,y)=>{
var diff=x-y;
return Math.abs(diff);
}
高阶函数
以一个或多个函数作为参数的函数
function f(m,n,fn){ //m,n是普通参数,fn是函数参数,因此fn是高阶函数 return fn(m-n); } var t=f(12,9,Math.abs)//把Math对象的abs函数传递给fn console.log(t)
闭包
当函数作为返回值,或作为参数传递时,该函数成为闭包(函数内部定义函数,可以访问外部函数的参数)
var basePrice=10.0//起步价 var baseMiles=3.0//起步公里数 function taxiPrice(untiPrice,MilesAge){ function totalPrice(){//函数内部定义函数(闭包),访问外部函数的参数 if(MilesAge>baseMiles){ return untiPrice*MilesAge} else { return basePrice } } return totalPrice()//将函数作为返回值返回 } var t=taxiPrice(2.0,5.0) console.log(t)
类
ES5通过构造方法创建类
ES6中通过class关键字创建类
回调函数
(1)fs模块:是filesystem(文件系统),是node提供的异步读写文件模块
const fs=require('fs')//导入fs模块 console.log('主程序开始...') //调用fs的readFile函数异步读取文件(demo.txt)内容 //(1)匿名回调函数:若文件读取异常,err中存放的异常信息 //(2)data参数:从文件中读取的内容 fs.resdFileSync('../text/demo.txt',function(err,data){ if(err){ console.error(err) console.log(data.toString()) }) console.log('主程序结束...')
事件机制
触发事件:emit('事件名称')
const EvenEmitter=require('events').EventEmitter //引入事件模块 const myEvent=new EventEmitter()//实例化事件对象 //注册事件:seen myEvent.on('seen',function(who){ console.log('报告,来了一位'+who) }) myEvent.on('seen',function(){ console.log('欢迎光临!!!') }) //触发事件 myEvent.emit('seen','女士')
NODE的全局对象
1.__filename代表当前执行的脚本文件的名字(带绝对路径)
2.__dirname代表当前正在执行的脚本文件所在目录
3.Console类
4.process对象:进程对象
示例:使用readline对象+process对象实现终端的输入输出
line事件:在用户输完一行,按下回车就会发生的事件,会将用户输入的数据通过回调函数传回来,可在此方法里处理用户输入的数据
console.log('文件名:'+__filename)//文件名 console.log('目录名:'+__dirname) const out =getStreamSomwhow() const myConsole=new console.Console(out,err)
const readline=require('readline') var r1=readline.creatInterface( {//创建一个接口 input:process.stdin,//表示标准的输入终端 output:process.stdout//表示标准的输出终端 }) //注册'line'事件 r1.on('line',function(data){ switch(data,trim()){ case'copy': console.log('复制') break case'hello': console.log('hello world!') break case'close': r1.close() break default: console.log('没有这个指令') } }) r1.on('close',function(){ console.log('bye bye'); process.exit(0); })
NODE定时器
一次性定时器:setTimeOut(函数,间隔时间)
周期性定时器:setInertVal(函数,间隔时间)
即使定时器:setImmediate()
BUFFER数据类型
1.用于处理二进制数据的数据类型
2.一个buffer对象类似于一个整型数组,大小在创建时确定并且不能改变
3.buffer对象的创建
(1)buffer.from([])
(2)buffer.alloc([])
4.作用:用于编码的转换
在文件操作(读写)和网络操作(前后端交互),如果没有显式声明格式,返回数据的默认类型都是buffer
通过使用显式字符编码将Buffer实例与javascript字符串相互替换
将Buffer实例转换成JSON对象
var buf7=Buffer.from([1,2,3,4,5]) var json=buf7.toJSON console.log(json.data) json={ type:'Buffer', data:[1,2,3,4,5] } console.log(json.data)
JSON对象
JSON是一种轻量级的数据交换格式,JSON采用完全独立于语言(编程语言)的文本格式,是一种理想的数据交互语言
使用场景:只要应用程序需要将结构化信息作为文本进行交换或存储,即可使用它
{
code:200,
msg:'查询成功'
}
['123','456'
]
格式要求(语法要求)
(1)数据存放在key-value中
(2)数据用逗号分隔
(3)画括号保存对象({ })
(4)方括号保存数组([ ])
var buf1=Buffer.from([1,2,3]) console.log(buf1) var buf2=Buffer.from('test') console.log(buf2) //创建长度为10的buffer对象,默认0进行填充 var buf3=Buffer.alloc(10) console.log(buf3) //创建长度为10的buffer对象,由1填充 var buf4=Buffer.alloc(10,1) console.log(buf4) //创建buffer对象时,指定编码格式 var buf5=Buffer('Hello World','ascii') console.log(buf5) var buf6=Buffer('test') console.log(btf6) console.log('十六进制:'+buf6.toString('hex')) console.log('UTF8'+buf6.toString('utf8'))
Node.js Express框架
Express介绍
Express是一个最小的,灵活的Node.js Web应用程序,提供了一套强大的功能来开发Web和移动应用程序。核心功能是
1.允许设立中间件相应HTTP请求
2.定义了用于执行基于HTTP方法和URL不同动作的路由表
3.允许动态渲染基于参数传递给模板HTML页面
安装Express
npm install -g express-generator
查看Express版本号
express--version
创建项目
(1)创建目录
(2)进入该目录执行指令:express 项目名
例如:express hello
(3)进入项目所在目录,执行指令:npm install 安装相关依赖模块
例如 cd hello
hello>npm install
(4)启动项目:npm start--默认项目的端口号是3000
(5)浏览器访问:http://localhost:3000
修改项目监听端口号:./bin/www
安装nodemon模块,实时跟踪源程序的变化,安装完成后打开package.json文件
"scripts":{
"start":"nodemon ./bin/www"
}
bin 启动配置文件,在www里修改运行端口号 node_modules 存放所有项目依赖库 public 用于存放静态资源文件、图片、css、js文件 routers 路由文件 views 存放页面 package.json 项目依赖配置及开发者信息 app.js 应用核心配置文件,项目入口
Express中间件
处理客户请求的一系列方法
————>服务端
请求 中间件1处理请求
客户端(浏览器) 中间件2处理请求
<———— 路由器处理请求
响应
由中间件方法和请求处理函数组成
中间件方法由Express提供,负责拦截请求
请求处理函数由开发人员编写,处理请求
app.get('请求路径','请求处理函数')
app.post('请求路径','请求处理函数')
app.use
Express接受请求参数
接受get请求
req.query.参数名
接受post请求
req.body.参数名
接受路由请求参数:定义路由时,在请求路径中传递的参数
req.params
Ajax请求
Aiax是一种网页开发技术,可以实现页面无刷新更新数据,提高用户浏览网页的体验
基本实现步骤
(1)创建Ajax对象
var xhr =new XMLHTTPRequest();//xhr就是Ajax对象(异步请求对象)
(2)配置Ajax对象 open()方法 xhr.open('请求方式','请求地址')
(3)发送请求 send()方法 xhr.send()
(4)获取服务端的响应信息
xhr.οnlοad=function(){}
(5)获取服务器端相应给客户的数据
xhr.onreadystatechange=function(){}
//创建ajax对象 var xhr=XMLHTTPquest() //输出ajax对象的状态码 console.log(xhr.readyState); xhr.open('get','http://loacalhost:3000/params//gets') console.log(xhr.readyState); //监听onload事件(看看服务器是否相应),并使用send()方法发送请求 xhr.onload=function(){ console.log(xhr.readyState)//获取状态码 console.log(xhr.responseText)//输出 Hello ,Ajax } xhr.send(); //onreadystatechange只有当服务器端响应发生改变时触发 xhr.onreadystatechange=function(){ console.log(xhr.readyState);//获取状态码,如果状态码为4代表数据已经接收完成 if(xhr.readystate===4){ console.log(xhr.responseText);} }
状态码
4 请求响应已完成,可以使用服务器响应
获取状态码方法
xhr.readyState
获取服务器响应数据
xhr.responseText
跨域&同源
同源
地址里面的协议域名和端口号,相同为同源
同源策略是浏览器安全功能,不同于源客户端没有明确授权时不能读写对方资源,a.com下的js脚本用a.jax读取b.com的数据会报错
跨域
协议、域名、端口号有一个不同就是跨域
针对JavaScript和Ajax,html本身没有跨域
在express项目中解决跨域问题的办法
安装cros模块:npm install cros
在app.js文件中配置cros
app.use('cros')
导入:在app创建之前导入
使用:在app创建之后,在配置路由路径之前