服务端开发
服务端基础
软件结构
- C/S体系结构
- 客户端/服务端,例如QQ、 盘
- 优点:交互性好,对服务器压力小,安全
- 缺点:服务器更新时需要同步更新客户端
- B/S体系结构
- 浏览器/服务端,例如 站
- 优点:不需要更新客户端
- 缺点:交互性差,安全性低
web服务器
能够提供web访问服务的机器就是 站服务器,能接收浏览器端的请求,能对请求做出响应。
IP地址
在互联 中电脑的唯一标识。例如:113.45.94.17。浏览器端请求服务器端的资源首先要有这台服务器的IP地址,才能找到这台服务器。
如果将本机作为服务器,本机有一个特定的IP是 127.0.0.1
域名
由于IP地址难于记忆,所以产生了域名的概念,所谓域名就是平时上 所使用的 址。
IP地址与域名是对应的关系,在浏览器的地址栏中输入域名,会有专门的服务器 (DNS) 将域名解析为对应的IP地址,从而找到对应的服务器。
如果将本机作为服务器,本机有一个特定的域名是 localhost
端口
通过IP地址找到对应的服务器以后,还需要指定端口来进一步确定访问的是当前服务器提供的什么服务。比如80是apache服务默认占用的端口,3306是mysql服务占用的端口。
URL
统一资源定位符,是互联 上标准资源的地址。
请求与响应
创建web服务器
在NodeJs中不需要安装额外的软件充当 站服务器,NodeJs中提供的HTTP模块即可创建web服务器。
HTTP协议
超文本传输协议,用于从web服务器传输超文本到本地浏览器的传送协议,基于客户端服务器架构工作。
请求 文
- 请求方式
- 请求地址
响应 文
- HTTP状态码
- 200 请求成功
- 404 请求的资源没有被找到
- 内容类型
- text/html
- text/css
请求参数
客户端向服务器端发送请求时,有时需要携带一些客户信息,比如登录操作。客户信息需要通过参数的形式传递到服务器端。
GET传参
参数被放置在地址栏中,格式为:name=zhangsan&age=20
POST传参
参数被放置在请求体中,格式和GET参数相同。
路由
路由是指URL地址与程序的映射关系,更改URL地址可以改变程序的执行结果。简单说就是请求什么响应什么。
客户端请求方式
- 浏览器地址栏
- Form表单提交
- link标签的href属性
- script标签的src属性
- image标签的src属性
静态资源处理
服务器端不需要处理,可以直接响应给客户端的资源就是静态资源,例如CSS、JavaScript、image文件。
使用Node.js的第三方模块serve-static处理静态资源的响应。
Node.js工作原理
同步异步
同步或者异步指的是服务器端处理请求的方式。
同步方式
当你来到餐馆,一个指定的服务员被分配给你服务,当你点完餐时,服务员将订单送到厨房并在厨房等待厨师制作菜肴,当厨师将菜肴烹饪完成后,将菜肴送到你的面前,服务完成.此时这个服务员才能服务另外的客人.同步模式就是一个服务员同时只能服务于一个客人.
你可以想象,餐馆就是服务器,服务员就是线程,客户端向服务器端发送的请求就是吃饭的客人.当客户端向服务器发送请求时,服务器端需要为请求分配一个线程处理该请求,在请求的过程中可能会去读取出数据或者文件,这是一个需要时间的操作,就好像厨师炒菜需要时间一样,此时线程只是等待操作的完成.如果此时有新的请求来了,服务器需要分配一个新的线程为该请求服务,必须要知道的是,分配一个线程大约消耗服务器端2MB的内存.想象一下,如果同一时间,服务器接收到大量的请求,服务器可能会消耗掉所有内存提供服务,同一时间再有请求来的时候必须等待,等待有空闲的线程才能为该请求服务,如果不想让该请求等待,服务器端需要增加更多的硬件(内存)设备.这种同步方式显然没有有效的利用现有的资源.
异步方式
当你来到餐馆,在点餐后服务员将你的订单送到厨房,此时服务员没有在厨房等待厨师烹饪菜肴,而是去服务了其他客人,当厨房你的菜肴烹饪好以后,服务员再将菜肴送到你的面前.异步模式就是一个服务员同时可以服务多个客人.
Node就是基于异步的应用程序.在Node中,用一个线程处理所有的请求.当客户端向服务器端发送请求时,服务器端的一个线程处理该请求,在请求的过程中如果去查询数据库或者读取文件,该线程不会等待查询的结果,转而去处理其他请求,Node程序会监控数据库的查询结果,如果查询完成,该线程会重新回来处理该请求.Node擅长处理高并发的 络请求或频繁的数据取读取型应用程序,不会带来硬件成本的增加.这种异步的模式显然有效的利用了现有的资源.
代码执行顺序
同步方式
代码一行一行执行,下一行的代码必须等待上一行代码执行完成以后才能执行.
异步方式
代码在执行过程中某行代码需要耗时,代码的执行不会等待耗时操作完成以后再去执行下一行代码,而是不等待直接向后执行.异步代码的执行结果需要通过回调函数的方式处理.
Promise
Promise出现的目的是解决Node.js异步编程中回调地狱的问题
Promise本身是一个构造函数,要使用promise解决回调地狱的问题 需要使用new运算符创建Promise构造函数的实例对象
在创建对象的时候需要传入一个匿名函数,匿名函数中有两个参数 resolve,reject
异步函数
异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了
async
- 普通函数定义前加async关键字 普通函数变成异步函数
- 异步函数默认返回promise对象
- 在异步函数内部使用return关键字进行结果返回 结果会被包裹的promise对象中 return关键字代替了resolve方法
- 在异步函数内部使用throw关键字抛出程序异常
- 调用异步函数再链式调用then方法获取异步函数执行结果
- 调用异步函数再链式调用catch方法获取异步函数执行的错误信息
await关键字
- await关键字只能出现在异步函数中
- await promise await后面只能写promise对象 写其他类型的API是不不可以的
- await关键字可是暂停异步函数向下执行直到promise返回结果
promisify改造函数
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!