Node.js(1)

一、Node.js简介

1、什么是Node.js

  • 简称Node,封装了谷歌的V8引擎,使Javascript可以在服务器端运行。
  • Node.js运行时环境包含执行JavaScript程序所需的一切条件。该引擎会将JavaScript代码转换为更快的机器码。
  • Node.js进一步 提升JavaScript的能力,使JavaScript可以访问文件、读取数据库、访问进程,从而胜任后端任务。
  • 使用Node.js的最大优点是开发人员可以在客户端和服务器端编写JavaScript,打通了前后端。
  • Node.js发展迅速,目前已成为JavaScript服务器端运行平台的事实标准。

2、Node.js特点

2.1、非阻塞IO:又称为异步IO,

  • 非阻塞I/O又称异步式I/O,是Node.js的重要特点。
  • 阻塞I/O是指线程在执行过程中遇到I/O操作时,操作系统会撤销该线程的CPU控制权,使其暂停执行,处于等待状态,同时将资源转让给其他线程。
  • 非阻塞I/O是指当线程遇到I/O操作时,不会以阻塞方式等待I/O操作完成或数据返回,而只是将I/O请求转发给操作系统,继续执行下一条指令。

2.2、事件驱动

  • 非阻塞I/O是一种异步方式的I/O,与事件驱动密不可分。
  • 事件驱动以事件为中心,Node.js将每一个任务都当成事件来处理。Node.js在执行过程中会维护一个事件队列,需执行的每个任务都会加入事件队列并提供一个包含处理结果的回调函数。
  • 在事件驱动模型中,会生成一个事件循环线程来监听事件,不断地检查是否有未处理的事件。
  • Node.js的异步机制是基于事件的,所有磁盘I/O、网络通信、数据库查询事件都以非阻塞的方式请求,返回的结果由事件循环线程来处理。

2.3、单线程:主线程维护一个事件队列,当接收到请求后,会将请求放入队列,然后去接受下一个请求。在JS层面是单线程的,但node本事是多线程的平台。

  • Node.js的应用程序是单进程、单线程的,但是通过事件和回调支持并发,性能变得非常高。
  • 在阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须使用多线程。
  • 在非阻塞模式下,线程不会被I/O操作阻塞,该线程所使用的CPU核心利用率永远是100%,I/O操作以事件的方式通知操作系统。
  • Node.js在主线程中维护一个事件队列,当接收到请求后,就将该请求作为一个事件放入该队列中,然后继续接收其他请求。
  • Node.js内部通过线程池来完成非阻塞I/O操作,Node.js的单线程是指对JavaScript层面的任务处理是单线程的,而Node.js本身是一个多线程平台。

Node.js采用非阻塞I/O与事件驱动相结合的编程模式,与传统同步I/O线性编程思维有很大的不同,Node.js程序的控制很大程度要依靠事件和回调函数,这不符合开发人员的常规线性思路,需要将一个完整的逻辑拆分为若干单元(事件),从而增加了开发和调试的难度。

3、nodemon插件:可以监视node程序的改动,并自动重启node程序,

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端口上')
})

Node.js(1)_第1张图片

二、Node的基本语法

1、箭头函数(ES6)

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语句。

2、高阶函数:

一个函数的参数也是函数。

 //高阶函数

function f(m,n,fn){ //m,n是普通的参数,fn是一个函数参数,因此f就是高阶函数
    return fn(m-n)
}

var t = f(12,9,Math.abs)  //把math对象的abs函数传递给fn

在这里插入图片描述

3、闭包函数

闭包函数:当函数作为返回值,或者数传递时,该函数称为闭包。

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)

在这里插入图片描述

4、回调函数

介绍回调函数之前我们先来稍微了解一下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('主程序结束...')

Node.js(1)_第2张图片

三、Node的事件机制

1、事件监听

(1)引入事件模块:events
(2)创建事件对象:EventEmitter
(3)注册事件:on(‘事件名称’,‘回调函数’)

2、触发事件:emit(‘事件名称’)

//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','女士')

在这里插入图片描述

四、Node的全局对象

1、__filename

__filename:代表当前正在执行的脚本文件的名字(带绝对路径)。

2、__dirname

__dirname:代表当前正在执行的脚本文件所在的目录。

console.log('文件名:'+__filename)//文件名:E:\前端\7.16\005.js
console.log('目录名:'+__dirname)//目录名:目录名:E:\前端\7.16

在这里插入图片描述

3、Conlose类:

全局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!到标准错误流

Conslose类:
Node.js(1)_第3张图片

4、process对象:进程对象

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)
})

五、Node的定时器

1、一次性定时器:setTimeout(函数,间隔的事件)
2、周期性定时器:setInterval(函数,间隔的时间)
3、即时定时器:setImmediate()
4、分别用clearTimeout()、clearlnterval)和clearlmmediate()方法取消相应定时器,防止该定时器触发。

六、Buffer数据类型

1、用于处理(临时存储)一些二进制数据的数据类型

2、Buffer对象类似于整数数组,大小在创建时确定并且不能改变

3、Buffer对象的创建

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、作用:用于编码的转换

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)

在这里插入图片描述
扩展:
1、 什么是JOSN对象?

JSON是一种轻量级的数据交换格式,JSON采用完全独立于语言(编程语言)的文本格式。

2、使用对象:只要应用程序需要将结构化信息作为文本进行交换或存储,即可使用它。

3、语法规则:
(1)、数据存放在key-value对中
(2)、数据用逗号隔开
(3)、花括号({})保存对象
(4)、方括号([])保存数组

你可能感兴趣的:(node.js,javascript,前端)