node复习
- 1:模块化seajs和require 更好的融合到nodejs模块
- 2:node是什么? JavaScript在浏览器和node环境下的区别? global
- 3:process: argv/pid/env/process.nextTick()/process.exit()
- 模块加载机制
- 文件加载:js/json/node
- 文件夹加载
- package.json文件内main属性作为入口
- 将文件名作为当前目录级别的文件来查找(js/json/node)
- 查找文件夹内的index.js
- 4:异步–> 回调
- 回调的信息:异步操作结束时机、返回值、错误对象
- 回调函数错误优先、函数参数中回调函数最后
- 异常:异步异常无法被捕获
- try/throw
- 能处理就处理,不能处理就throw
- 前台,尽量都处理
- 自定义异常,非阻塞IO。
- 5:ES6&文件
- ES6:
- let、const、箭头函数、模板字符串、扩展函数、
- str.includes(‘a’)判断是否包含
- str.startsWith(‘g’)判断以什么开头
- str.endsWith(‘g’)判断以什么结尾
- str.repeat(3);重复当前字符串多少次
- 数学 Math.trunc(num) 截取整数
- 数组
- Array.from(obj); //obj必须有length,key只能是数字或者字符串数字
- Array.of(1,2,3,4);//返回数组
- 操作数组
- 数组.find(function(element,index,arr){}) 返回元素
- 数组.findIndex(function(element,index,arr){}) 返回元素下标
- 文件:
- 文件读
fs.readFile(路径,(err,data)=>{});
- 写文件
fs.writeFile(路径,(err)=>{});
- 获取状态 fs.stat(路径,(err,stats)=>{})
- 判断是否是文件:stats.isFile()// isDirectory()文件夹 size文件大小
- 文件监视 chiokdar 监视文件
- fs无法监视子文件夹、会产生两次响应、偶尔rename接受为change、内存暴增
- 6:IO和http:
let rs = fs.createReadStream(path);//创建读取流
let ws = fs.createWriteStream(path);//rs.pipe(ws)
- http模块部分
- 服务端对象 http.createServer();
- 客户端对象 http.request(optins);
- 请求对象 request
- 响应对象 response
- 请求对象获取数据
- req.url/req.method/req.on(‘data’,(data)=>{})
- res.writeHead()/res.write()/res.end()/
- http1.0和http1.1的区别
- http1.0 无连接 一次请求对应一次连接的开启和关闭
- http1.1 根据connect:keep-alive 同域下一次请求开启连接,请求多资源完毕,客户端关闭页面,连接关闭
- 三次握手
- 客户端发起 syn码请求建立联机
- 服务端 发送ack确定码及syn码 同时分配联接
- 客户端发起 ack确认
- 四次挥手
- 客户端发起 fin码
- 服务端发起 ack确认码 客户端继续等待服务确认
- 服务端发起 fin码 确认数据已经发送完毕,客户端可以退出
- 客户端发起 ack码 退出
express
- 基于 Node.js 平台,快速、开放、极简的 web 开发框架。
安装
- 安装 npm install express –save
- require(‘express’);
helloworld
- express带来的便捷:
- 我的音乐,文件名是中文的,发送请求的时候,浏览器为我们做了编码
- decodeURI(req.url) 解码,在express中,这个不用了
- 启动流程
- 1:下载
npm i express --save
- 2: 引入对象
const express = require('express');
- 3: 创建服务器对象
let app(application) = express();
- 4: 处理请求
app.get('url',function(req,res){处理请求..})
- 5:开启服务器监听端口
app.listen(80,function(){服务器启动了});
基本路由
app.get('/',(req,res,next)=>{
console.log('罗伯特你');
next();
});
app.get('/',(req,res)=>{
console.log('朱丽叶我')
});
1:为什么先匹配罗伯特你?
按照代码顺序执行,这一个环境有一个开关,确定是否继续往下执行next
res.json(obj);
res.json = function(obj){
let objStr = JSON.stringify(obj);
res.end(objStr)
}
路由
- 后端路由由什么组成:
- URL和请求方式组成,根据不同的路由,程序中做不同的处理的分发
- /edit?id=1 –> 做编辑音乐的处理
- /del?id=1 –> 分发给删除音乐操作的模块
问题
- 请求状态一直是pending,一般是我们没有res.end();//没有响应浏览器
- 如果一味的调用next(),最终不响应客户端,客户端会看到404找不到页面
- 一组中间件来说,总要有一个next或者end,
- 如果出现pending状态(浏览器一直转)
- 要么是没有next,要么没有end
res常用函数
- express中保留了原来原生的API,在此基础上扩展了一些功能
res.download() 提示下载文件。
res.end() 终结响应处理流程。
res.json() 发送一个 JSON 格式的响应。
res.jsonp() 发送一个支持 JSONP 的 JSON 格式的响应。
res.redirect() 重定向请求。
res.render() 渲染视图模板。
res.send() 发送各种类型的响应。
res.sendFile 以八位字节流的形式发送文件。
res.sendStatus() 设置响应状态代码,并将其以字符串形式作为响应体的一部分发送
中间件
- 中间件的使用方式
- app.use((req,res,next)=>{});
- 如果不给虚拟目录,当前中间件执行的暗号,代表着任何请求都通吃,都会被匹配上
- 如果给定虚拟目录(中间件的ID或者名称),就代表着只能通过地址栏
http://127.0.0.1:80/虚拟目录被访问
中间件级别
- 应用级中间件是一直关联着应用程序的
- 路由及中间件,需要手动加入到express处理中间件流程中
- 错误处理中间件,和一般中间件相比,多了一个参数
app.use((err,req,res,next)=>{});
- 抛出异常使用
next(err);
- 内置中间件 express.static(路径); //将当前目录下的所有资源,都能根据url来返回
router.post('/',(req,res,next)=>{
fs.readFile(path,(err,data)=>{
if(err)next(err);
});
}});
处理静态资源文件
- 举例:08_static中,我们
static('assets');在地址栏中 127.0.0.1/css/a.css就能访问
模板引擎
- 我的音乐:
- 首页先回来,再发送ajax请求,获取所有的歌曲,然后使用art-template来插入Html(前端渲染)
- 点击编辑,将对应的id传递到服务器,服务器查询出歌曲数据,然后做了一个渲染,再将整个有数据的页面发送回到浏览器(后端渲染)
- 前后端渲染的区别在于,机器的载体是谁,后端渲染性能更高
- 解决首屏幕白屏问题
- 1:下载模板
npm i jade --save
- 2:通过app对象设置模板保存路径
app.set('views','./views');
- 3:通过app对象设置模板引擎
app.set('view engine','jade');
- 4:在响应用户的时候调用
res.render('指定模板名,省略后缀',{要填入的数据对象});
总结
- npm 下载的时候,如果当前没有package.json文件,会逐级向上查找,如果找到Node_modules目录,就保存在这个目录里面
- 1: 下载express
npm i express --save
- 2: 在app.js内引入对象
const express = require('express');
- 3: 创建服务器对象
let app = express();
- 4: 创建路由对象
let router = express.Router()
- 5: 配置路由规则及处理
router.get('/',(req,res,next)=>{});
- 6: 响应用户页面数据
- 6.1: 配置模板引擎
- 配置文件路径
app.set('views','./views');
- 配置模板引擎
app.set('view engine','jade');
- 安装模板
npm i jade --save
要保持和express在一个目录下
- 7: 响应用户一个模板的内容
res.render(模板名免后缀,{title:'abc',message:'大家好'});
- 8: 处理静态资源
app.use(express.static(想要向外暴露的目录名));
- 9: 将路由中间件关联到中间件队列
- 10: 开启服务器监听端口