一、什么是Node?
node是一个基于Chrome V8引擎的javascript运行环境,是运行在服务器端的javascript
可以使用node搭建服务器,连接数据库。让前端开发人员走向后端开发。
Node.js使用了一个事件驱动、非阻塞I/O口,使其轻量且高效
Node的包管理工具npm,是全球最大的开源库生态系统
二、为什么要学习node?
他很火
他很强
三、node的环境搭建参考笔记:
自己有道云
检测是否安装成功
四、交互式解析器
Node 自带了交互式解释器,可以执行以下任务:
读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中
执行 - 执行输入的数据结构
打印 - 输出结果
循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出
通过node命令进入交互式解析器
四、http模块创建服务
引入http模块
var http = require('http');
console.log(hhtp)
创建服务
/*
创建服务
request请求 response响应
*/
http.createServer(function(request,response){
// writeHead设置响应请求头
response.writeHead(200,{
'content-type':'text/html;charset=utf-8'})//表示请求成功时设置能识别中文
// end()响应请求 一个服务智能出现一个end,end后面的代码不执行
response.end('<h1>hello world</h1>');//必须写end(),表示结束
// listen监听端口号
}).listen(3000)//监听3000这个端口
设置响应请求头,并解决字符乱码
设置writeHead 响应请求头
参数一:http状态码 200 Ok
参数二:内容的类型
text/plain 文本
text/html html标记语言(建议使用)
text/json json数据
text/url-list url列表
response.writeHead(200,{
'content-type':'text/html;charset=utf-8'})
response的方法
write() 写入数据到页面,可以重复使用,但不能放到end之后
end() 一个服务只能出现一次,且end后面的代码将不会被执行
4.1输出hello world例子
效果图
1.在node里面新建1.js文件
2.在1.js里面写下如下代码
// Node.js里面使用的是Common.js的语法 export导出 require导入
var http =require('http')
// console.log(http)
/*
创建服务
request请求 response响应
*/
http.createServer(function(request,response){
// writeHead设置响应请求头
response.writeHead(200,{
'content-type':'text/html;charset=utf-8'})//表示请求成功时设置能识别中文
// end()响应请求 一个服务智能出现一个end,end后面的代码不执行
response.end('<h1>hello world</h1>');//必须写end(),表示结束
// listen监听端口号
}).listen(3000)//监听3000这个端口
console.log('server is running at localhost:3000')
3.cmd里面进入node,并且输入node 1.js
4.浏览器打开localhost:3000
五、node中的阻塞和非阻塞
5.1阻塞
效果图
// 阻塞读取
// 1.引入文件模块
var fs=require('fs')
// console.log(fs)
// 阻塞代码 同步读取文件
// 2.使用
var data=fs.readFileSync('葵花宝典.txt')
// 先执行
console.log(data.toString())
// 后执行
console.log('读取完成.....,拿到内容后才执行我')
5.2非阻塞
效果图
// 非阻塞读取
// 1.导入
var fs=require('fs')
/*
fs.readFile(path,callback)异步读取文件内容
data为异步读取的文件数据
err为目录或路径写错
*/
// 2.使用
fs.readFile('葵花宝典.txt',function(err,data){
if(err){
console.log(err)
}else{
console.log(data.toString())//toString() 将数据流转为字符串
}
})
console.log('我先执行')
六、事件循环
6.1介绍
Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
Node的所有API都支持回调函数
Node.js 基本上所有的事件机制都是用设计模式中观察者模式
实现
事件的方法
on(event,listener) 为一个指定的事件注册监听器
emit(event,[arg1],[arg2],[arg3]...)按监听器的顺序执行执行每个监听器
addListener(event, listener)为指定事件添加一个监听器到监听器数组的尾部
once(event,listener)为指定事件添加一个单次监听器
removeListener(event,listener)移除指定事件的某一个监听器
removeAllListeners(event)移除指定事件所有的监听器
listeners(event)返回指定事件的监听器数组
listenerCount(emitter,event)返回指定事件当前监听器的数量
语法:events.EventEmitter.listenerCount(emitter,event)
setMaxListeners(n)设置最大的监听器个数 默认为10个
超过事件监听器的个数则报错如下
事件方法的例子
addListener
var event=require('events')
var emitter=new event.EventEmitter();
function listener1(){
console.log('事件监听器1')
}
function listener2(){
console.log('事件监听器2')
}
function listener3(){
console.log('事件监听器3')
}
// 监听事件 addListener(eventName,listener)
// on和addListener的区别: on监听事件可以移除,addListener监听的事件可以移除,removeListener和removeAllListener移除事件监听
emitter.addListener('connect',listener1)
emitter.addListener('connect',listener2)
emitter.emit('connect')
listeners(eventName)返回事件的数组
console.log(emitter.listeners('connect'))//[ [Function: listener1], [Function: listener2] ]
listenerCount(实例化对象,eventName)
var listenerNum=event.EventEmitter.listenerCount(emitter,'connect');
console.log(`监听器的数量${
listenerNum}`)//2
removeListener(eventName,监听器名字)移除指定的单个监听器
emitter.removeListener('connect',listener2)
console.log(emitter.listeners('connect'))
removeAllListeners(eventName)移除所有的监听器
emitter.removeAllListeners('connect')
console.log(emitter.listeners('connect'))
6.2使用步骤
1、引入事件模块
var events=require('events');
2、创建一个eventEmitter对象
var emitter = new events.EventEmitter();
3、监听事件
eventEmitter.on(eventName,handler) 绑定事件,为该事件分配一个观察者
eventName为自定义的事件名 handler为触发事件时,执行的函数
4、触发事件
eventEmitter.emit(eventName,arg1,arg2...) 触发指定的自定义事件
6.3例子
效果图
// 1.引入事件event模块
var events=require('events');
// 2.创建一个eventEmitter对象
var emitter = new events.EventEmitter();
/*
3.emitter.on(eventName,eventHandler)监听事件
eventName为自定义事件名
回调函数里面的参数为触发事件里面的内容
*/
emitter.on('connect',function(a,b){
console.log('服务器连接成功')
console.log(a)
console.log(b)
})
// 4.emitter.emit(eventName,arg1,arg2,....)触发事件 eventName后面可以传入自定义参数
setTimeout(function(){
emitter.emit('connect','张三','李四')
},1000)
6.4例子二
效果图
/*
总结:on的执行是由于emit发生才执行
*/
// 1.引入事件event模块
var events=require('events');
// 2.创建一个eventEmitter对象
var emitter = new events.EventEmitter();
/*
3.emitter.on(eventName,eventHandler)监听事件
eventName为自定义事件名
回调函数里面的参数为触发事件里面的内容
eventEmitter的每个事件允许传入若干个参数
*/
function listener1(){
console.log('事件监听器1')
}
function listener2(){
console.log('事件监听器2')
}
function listener3(){
console.log('事件监听器3')
}
function listener4(){
console.log('事件监听器4')
}
emitter.on('connect1',listener1)//事件监听器2
emitter.on('connect2',listener2)//事件监听器1
emitter.on('connect3',listener3)//事件监听器3
emitter.on('connect3',listener4)//事件监听器4
/*
注意:
event事件的执行顺序跟其其触发的先后顺序有关
event事件运行同一个事件名绑定多个监听器,且根据on的顺序依次触发
*/
emitter.emit('connect2')
emitter.emit('connect1')
emitter.emit('connect3')
七、模块
7.1介绍
模块系统的作用主要体现在Node.js的文件的相互调用。
模块系统是Node的基本组成部分,每一个Node.js文件则为一个模块
常见的模块:http、fs、events、url、queryString
7.2使用步骤
1) 创建模块 导出的模块可以为函数、对象...
(2) 导出模块 exports module.exports
(3) 引入模块 require(属于Common.js的语法)
(4) 使用模块
exports和module.exports的区别?
exports是module.exports的抽象化代表,module.exports是exports的具体实现。
7.3例子
效果图
1.创建hello.js这个自定义模板和world.js
2.在world.js导入hello.js这个模板
调用对象里面的方法:
hello.hello()
7.4完整代码
hello.js
// 定义模块
function hello(){
console.log('hello 你好呀')
}
// export.模块名 = 导出的内容
exports.hello = hello
world.js
// 导入自定义模块
var hello = require('./hello')
// console.log(hello)
hello.hello()
7.5自定义模块封装—实现学校有哪些班级
效果图
实现查询学校有哪些班级
1.文件目录
2.先写student.js
function add(studentName){
console.log(`学生:${
studentName}`)
}
// add('张三')
exports.add = add
测试一下
3.teacher.js
function add(teacherName){
console.log(`老师:${
teacherName}`)
}
// add('李四')
exports.add = add
测试一下
4.team.js
var student=require('./student')
var teacher=require('./teacher')
function add(obj){
// console.log(`班级名:${obj.team}`)
teacher.add(obj.teacher)
console.log(`班级:${
obj.teamName}`)
for(var i=0;i<obj.students.length;i++){
student.add(obj.students[i])
}
console.log('==========================')
}
// add({teamName:'前端',teacher:'吴老师',students:['鞠婧祎','诸绪丹','赵丽颖']})
exports.add =add;
测试一下
5.school.js
var team =require('./team')
function add(obj){
console.log(`学校名:${
obj.school}`)
for(var i=0;i<obj.teams.length;i++){
team.add(obj.teams[i])
}
}
add(
{
school:'文理',
teams:[
{
teamName:'前端1',
teacher:'吴老师',
students:['鞠婧祎','赵丽颖','诸绪丹']
},
{
teamName:'前端2',
teacher:'吴老师2',
students:['鞠婧祎2','赵丽颖2','诸绪丹2']
}
]
}
)
测试一下
7.6url模块
7.6.1介绍
var url=require('url')
console.log(url)
console.log(url)的结果
7.6.2使用步骤
1.引入url
var url=require('url')
2.使用url的方法
7.6.3例子
1.parse重点
将字符串转为对象
/*
// 2.使用parse
*第一个参数写字符串
*第二个参数表示query是否为对象:true->query变为对象 false->query变为字符串
第三个参数是否需要识别无协议的网址, true->需要识别 false->不需要识别
*/
var url=require('url')
var