NODE基础(八)

node复习

  • 1:模块化seajs和require 更好的融合到nodejs模块
    • module.exports
  • 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(){服务器启动了});
基本路由
  • get、post、put、delete、all
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');
    • 由此render的时候可以不加后缀名
  • 4:在响应用户的时候调用 res.render('指定模板名,省略后缀',{要填入的数据对象});
    • 这个对象的对应模板内使用的名称title
总结
  • 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: 将路由中间件关联到中间件队列
    • app.use(router);
  • 10: 开启服务器监听端口
    • app.listen(80,()=>{});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值