2.1、非阻塞IO:又称为异步IO,
2.2、事件驱动
2.3、单线程:主线程维护一个事件队列,当接收到请求后,会将请求放入队列,然后去接受下一个请求。在JS层面是单线程的,但node本事是多线程的平台。
Node.js采用非阻塞I/O与事件驱动相结合的编程模式,与传统同步I/O线性编程思维有很大的不同,Node.js程序的控制很大程度要依靠事件和回调函数,这不符合开发人员的常规线性思路,需要将一个完整的逻辑拆分为若干单元(事件),从而增加了开发和调试的难度。
3.1、安装:
在终端中输入npm install nodemon -g ----> 简写npm i nodemon -g
3.2、由nodemon运行node程序
演示:
const { read } = require('fs')
const http = require('http')
const httpServer = http.createServer(function(req,res){
//req:表示请求对象,res:响应对象,服务器端通过该对象向客户端发送响应信息
res.writeHead(200,{'Content-type':'text/plain'}) //设置响应头信息
res.end('bbbbbbb') //服务器向客户端发送信息
})
//服务器启动监听
httpServer.listen(8089,function(){
console.log('服务器运行在8089端口上')
})
1.1、有一个参数的箭头函数
//有一个参数的箭头函数
var f = x =>x*x
var k =f(45)
console.log(k)
1.2、有两个参数的箭头函数
var fn = (x,y) => {
x-y
return Math.abs(x-y)
}
var k1 = fn(3,5)
console.log(k1)
1.3、无参的箭头函数
var sum = () => 3*6
console.log(sum())
1.4、函数体带有多条语句的箭头函数:
var 变量名 = ()=>{
函数体语句
}
需强调:强调:若箭头函数的函数体用大括号({})括起来了,就没有默认的return功能.若函数需要返回数据就必须显式的使用return语句。
一个函数的参数也是函数。
//高阶函数
function f(m,n,fn){ //m,n是普通的参数,fn是一个函数参数,因此f就是高阶函数
return fn(m-n)
}
var t = f(12,9,Math.abs) //把math对象的abs函数传递给fn
闭包函数:当函数作为返回值,或者数传递时,该函数称为闭包。
var basePrice = 10.0
var baseMiles = 3.0
function taxiPrice(unitPrice,MilesAge){
function totalPrice(){ //函数内部定义的函数(闭包),可以访问外部函数的参数
if(MilesAge > baseMiles){
return unitPrice*MilesAge
}else{
return basePrice
}
}
return totalPrice()//将函数作为返回值返回
}
let k = taxiPrice(2.0,10.0)
console.log(k)
介绍回调函数之前我们先来稍微了解一下fs模块。fs模块是filesystem(文件系统),该模块是node提供的异步读写的文件的模块。
演示:
const fs = require('fs')
console.log('主程序开始...')
//调用fs的readFile函数异步读取文件(demo.text)内容
//(1)、匿名回调函数,若读取文件异常,err中存放的是异常信息
//(2)、data参数:从文件中读取的内容
fs.readFileSync('./demo.text',function(err,data){
if(err){
console.error(err)
}
console.log(data.toString())
})
console.log('主程序结束...')
(1)引入事件模块:events
(2)创建事件对象:EventEmitter
(3)注册事件:on(‘事件名称’,‘回调函数’)
//node事件
const EventEmitter = require('events').EventEmitter
const myEvent = new EventEmitter()
//注册事件
myEvent.on('seen',function(who){
console.log('报告,来了一位'+who)
})
myEvent.on('seen',function(){
console.log('欢迎光临!!!')
})
//触发事件
myEvent.emit('seen','女士')
__filename:代表当前正在执行的脚本文件的名字(带绝对路径)。
__dirname:代表当前正在执行的脚本文件所在的目录。
console.log('文件名:'+__filename)//文件名:E:\前端\7.16\005.js
console.log('目录名:'+__dirname)//目录名:目录名:E:\前端\7.16
全局conlose实例 | 说明 |
---|---|
console.log(‘hello world’); | 打印hello world到标准输出流 |
console.log(‘hello %s’, ‘world’); | 打印hello world到标准输出流 |
console.error(new Error(‘错误信息’)); | 打印 [Error: 错误信息] 到标准错误流 |
const name= ‘Robert’; | / |
console.warn(Danger ${name}! Danger! ); |
打印Danger Robert! Danger!到标准错误流 |
const readline = require('readline')
var r1 = readline.createInterface({ //创建一个接口
input: process.stdin, //stdin:表示标准的输入终端
output: process.stdout //stdout:表示标准的输出终端
})
//注册'line'事件
r1.on('line',function(data){
switch(data.trim()){
case 'copy':
console.log(data.toString())
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)
})
1、一次性定时器:setTimeout(函数,间隔的事件)
2、周期性定时器:setInterval(函数,间隔的时间)
3、即时定时器:setImmediate()
4、分别用clearTimeout()、clearlnterval)和clearlmmediate()方法取消相应定时器,防止该定时器触发。
3.1、Buffer.from([ ])
var buf1 = Buffer.from([1,2,3])
console.log(buf1)//输出为十六进制
var buf2 = Buffer.from('test')
console.log(buf2)
3.2、Buffer.alloc()
var buf3 = Buffer.alloc(10)
console.log(buf3)
//创建长度为10的buffer对象,用1来填充
var buf4 = Buffer.alloc(10,2)
console.log(buf4)
4.1、在文件操作和网络操作中,如果没有显示声明编码格式,返回数据的默认类型为Buffer。
//创建Buffer对象时,指定编码格式
var buf5=Buffer('Hello World','ascii')
console.log(buf5)
4.2、通过使用显式字符编码将Buffer实例与JavaScript字符串相互转换。
var buf6 = Buffer('test')
console.log('十六进制:'+buf6.toString('hex'))
console.log('UTF8:'+buf6.toString('utf8'))
4.3、将Buffer实例转换成JSON对象
var buf7 = Buffer.from([1,2,3,4])
console.log(buf7)
var json = buff.toJSON()
console.log(json.data)
JSON是一种轻量级的数据交换格式,JSON采用完全独立于语言(编程语言)的文本格式。
2、使用对象:只要应用程序需要将结构化信息作为文本进行交换或存储,即可使用它。
3、语法规则:
(1)、数据存放在key-value对中
(2)、数据用逗号隔开
(3)、花括号({})保存对象
(4)、方括号([])保存数组